2014-04-03 19 views
6

Ho iniziato il processo di migrazione da Google OpenID a OpenID Connect con OAuth 2.0 in seguito a quanto presentato in Documentation. Sono in grado di completare con successo il flusso di lavoro di recupero di openid_id e sub all'interno di id_token dall'endpoint del token, ma quando lo faccio, openid_id non corrisponde all'identificatore esistente che abbiamo nel nostro sistema. Impedendomi di mappare l'utente esistente al nuovo ID e impedendo all'utente di accedere alla nostra applicazione (o eventualmente di accedere come qualcun altro). l'id è del formato corretto, ma non corrisponde.Migrazione di Google OpenID a OpenID Connect: openid_id non corrisponde a

Ho impostato il parametro openid.realm sul nostro openid.realm esistente e impostato il reindirizzamento come suggerito dalla documentazione. Questo sta accadendo sia localmente che nei nostri ambienti azzurri ospitati. Sto usando JWT.JsonWebToken per decodificare l'id_token ma ho anche verificato che è stato decodificato correttamente utilizzando il decoder Web ospitato su google: JWT Decoder e ho trovato lo stesso identificatore OpenID che non corrispondeva a quello che abbiamo attualmente per quell'utente Dovrei anche notare che ho provato ad aggiungere l'ambito del profilo, ma ciò non ha fatto alcuna differenza.

Utilizziamo DotNetOpenAuth.OpenId per il nostro sistema originale, quindi non penso che il problema risieda qui. Ho esaminato ClaimedIdentifier che fa parte della risposta e corrisponde a ciò che salviamo nel nostro sistema per openId, quindi non lo salviamo in modo errato.

Di seguito è riportato ciò che viene utilizzato per generare l'Uri per la richiesta di autorizzazione. È principalmente una versione modificata del client 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; 
     } 

E qui è quello che usiamo per generare la richiesta all'endpoint token.

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

Utilizzando quanto sopra ho problemi in cui non viene restituito alcun token openid nei dati extra. Come hai ottenuto questo a ritornare? – Doug

risposta

3

Accertarsi di utilizzare esattamente lo stesso valore openid.realm durante la migrazione flussi come utilizzato durante l'iniziale OpenID2 flussi: eventuali disallineamenti in tali valori (anche una slash char mancante) comporterà valori di identificatore openID completamente diversi.