2014-04-03 2 views
6

과 일치하지 않습니다. Documentation에 제시된 내용에 따라 Google OpenID에서 OpenID Connect with OAuth 2.0으로 마이그레이션하는 과정이 시작되었습니다. 토큰 끝점에서 id_token 안의 openid_id와 sub를 검색하는 작업을 성공적으로 완료 할 수 있습니다.하지만 할 때 openid_id가 시스템에있는 기존 식별자와 일치하지 않습니다. 기존 사용자를 새 ID에 매핑하지 못하게하고 사용자가 Google 애플리케이션에 로그인하지 못하도록 방지합니다 (또는 누군가 다른 사람으로 로그인하는 것을 허용 할 수도 있음). id는 올바른 형식이지만 일치하지 않습니다.Google OpenID를 OpenID Connect로 마이그레이션 : openid_id가

openid.realm 매개 변수를 기존 openid.realm으로 설정하고 리디렉션을 문서에서 제안한 것과 동일하게 설정했습니다. 이것은 지역적으로나 우리의 푸른 환경에서 일어납니다. 나는 id_token을 해독하기 위해 JWT.JsonWebToken을 사용하고 있지만 웹에 디코드 된 호스트 인 Google : JWT Decoder을 사용하여 제대로 디코드되고 있음을 확인했으며, 현재 가지고있는 OpenID 식별자와 일치하지 않는 동일한 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

당신이 당신이 사용 된 최초의 OpenID2이 흐르는 동안 가 정확히 마이그레이션하는 동안 같은 openid.realm 값 흐름을 사용하시기 바랍니다 완전히 다른 openid 식별자 값.

관련 문제