2014-04-03 23 views
6

ile eşleşmiyor Documentation'da sunulanları izleyerek Google OpenID'den OpenID Connect ile OAuth 2.0'a geçiş sürecine başladım. Ben openID_id ve altını id_token içerisindeki belirteç son noktasından almanın iş akışını başarıyla tamamlayabilirim, fakat açtığımda openid_id, sistemimizde sahip olduğumuz mevcut tanımlayıcıyla eşleşmiyor. Mevcut kullanıcıyı yeni kimliğe eşleştirmekten ve kullanıcının uygulamanıza giriş yapmasını engellemekten (veya muhtemelen başka biri olarak giriş yapmasına izin vermekten). Kimlik doğru biçimdedir, ancak eşleşmiyor.Google OpenID'yi OpenID Connect'e Geçiş: openid_id,

openid.realm parametresini, varolan openid.realm'mize ayarlamanın yanı sıra, yönergelerin önerdiği gibi yeniden yönlendirmeyi ayarladım. Bu hem yerel hem de masmavi barındırılan ortamlarımızda oluyor. Ben JWT.JsonWebToken id_token kodunu çözmek için kullanıyorum ama google: JWT Decoder üzerinde web barındırılan kod çözücü kullanarak düzgün bir şekilde kodu çözüldüğünü doğruladı ve ben şu anda sahip olduğumuz ile eşleşmeyen aynı OpenID Tanımlayıcısı ile geldi bu kullanıcı için. Ayrıca, profil kapsamını da eklemeyi denediğimi, ancak hiçbir fark yaratmadığımı belirtmeliyim.

Orijinal sistemimiz için DotNetOpenAuth.OpenId kullanıyoruz, bu yüzden sorunun orada olduğunu düşünmüyorum. Yanıtın bir parçası olan ClaimedIdentifier'ı inceledim ve sistemimizde openId için kaydettiklerimizle eşleşiyor, dolayısıyla yanlış kaydetmiyoruz.

Yetkilendirme isteği için Uri'yi oluşturmak için kullandığımız şey aşağıdadır. DotNetOpenAuth.GoogleOAuth2 istemcisinin çoğunlukla değiştirilmiş bir sürümüdür. Burada

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; 
     } 

Ve

biz belirteç bitiş noktasına isteği oluşturmak için kullandığınız yöntemdir. Bu değerlere herhangi uyumsuzluk (hatta eksik Sondaki eğik çizgi karakter) yol açacaktır:

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

Yukarıdakileri kullanarak ek verilerde openid belirteci iade edilmeyen sorunlar var. Bunu geri almak için nasıl aldın? – Doug

cevap

3

emin sen kullanıldığı gibi ilk OpenID2 akar sırasında TAM göçü sırasında aynı openid.realm değeri akar kullanmak olun tamamen farklı openid tanımlayıcı değerleri.