2014-04-03 34 views
6

我已經開始了從Google OpenID遷移到OpenID Connect with OAuth 2.0的過程,其中包含Documentation中提供的內容。我能夠成功完成從token端點檢索id_token內的openid_id和sub的工作流程,但是當我這樣做時,openid_id與我們系統中現有的標識符不匹配。防止我將現有用戶映射到新ID並阻止用戶登錄到我們的應用程序(或者可能允許其他人登錄)。該ID是正確的格式,但只是不匹配。將Google OpenID遷移到OpenID Connect:openid_id不匹配

我已經爲我們現有的openid.realm設置了openid.realm參數,並且設置了與文檔建議相同的重定向。這在本地和我們的Azure託管環境中都會發生。我正在使用JWT.JsonWebToken來解碼id_token,但我也通過使用谷歌託管的解碼器在上驗證了它正在被正確解碼,並且我想出了與我們當前所用的相同的OpenID標識符爲那個用戶。我還應該注意到,我已經嘗試添加配置文件範圍,但這沒有任何區別。

我們使用DotNetOpenAuth.OpenId作爲原始系統,所以我不認爲問題在那裏。我已經檢查了響應中的ClaimedIdentifier,它確實與我們在openId系統中保存的內容相匹配,所以我們沒有正確保存它。

以下是我們用來爲auth請求生成Uri的內容。它主要是DotNetOpenAuth.GoogleOAuth2客戶端的修改版本。

protected static Uri GetServiceLoginUrl(Uri returnUrl) 
    { 
     var state = string.IsNullOrEmpty(returnUrl.Query) ? string.Empty : returnUrl.Query.Substring(1); 

     return BuildUri(AuthorizationEndpoint, new NameValueCollection 
      { 
       { "response_type", "code" }, 
       { "client_id", AppId }, 
       { "scope", "openid" }, 
       { "prompt", "select_account"}, 
       { "openid.realm", CloudServiceConfiguration.GetDNSName() }, 
       { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) }, 
       { "state", state }, 
      }); 
    } 

private static Uri BuildUri(string baseUri, NameValueCollection queryParameters) 
     { 
      var q = HttpUtility.ParseQueryString(string.Empty); 
      q.Add(queryParameters); 
      var builder = new UriBuilder(baseUri) { Query = q.ToString() }; 
      return builder.Uri; 
     } 

而且這裏是我們用來生成請求令牌端點。

protected static Tuple<string, string> GetAuthTokens(Uri returnUrl, string authorizationCode) 
    { 
     var postData = HttpUtility.ParseQueryString(string.Empty); 
     postData.Add(new NameValueCollection 
      { 
       { "grant_type", "authorization_code" }, 
       { "code", authorizationCode }, 
       { "client_id", AppId }, 
       { "client_secret", AppSecret }, 
       { "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) }, 
      }); 

     var webRequest = (HttpWebRequest)WebRequest.Create(TokenEndpoint); 

     webRequest.Method = "POST"; 
     webRequest.ContentType = "application/x-www-form-urlencoded"; 

     using (var s = webRequest.GetRequestStream()) 
     using (var sw = new StreamWriter(s)) 
      sw.Write(postData.ToString()); 

     using (var webResponse = webRequest.GetResponse()) 
     { 
      var responseStream = webResponse.GetResponseStream(); 
      if (responseStream == null) 
       return null; 

      using (var reader = new StreamReader(responseStream)) 
      { 
       var response = reader.ReadToEnd(); 
       var json = JObject.Parse(response); 
       var accessToken = json.Value<string>("access_token"); 
       var idToken = json.Value<string>("id_token"); 
       return new Tuple<string,string>(accessToken,idToken); 
      } 
     } 
    } 
+0

使用上面我有問題的附加數據中沒有返回openid標記。你是如何得到這個回報的? – Doug

回答

3

請確保您使用EXACTLY爲你所用的遷移在同一openid.realm價值流在最初的OpenID2流:在這些值的任何不匹配(甚至未斜線字符)會導致完全不同的openid標識符值。