将Google OpenID迁移到OpenID Connect:openid_id不匹配

我已按照文档中的内容开始了从Google OpenID迁移到OpenID Connect with OAuth 2.0的过程。 我能够成功完成从令牌端点检索id_token中的openid_id和sub的工作流程,但是当我这样做时,openid_id与我们系统中的现有标识符不匹配。 阻止我将现有用户映射到新ID并阻止用户登录我们的应用程序(或者可能被允许以其他人身份登录)。 id的格式正确,但不匹配。

我已将openid.realm参数设置为现有的openid.realm,并将重定向设置为与文档建议的相同。 这在本地和我们的azure色托管环境中都会发生。 我正在使用JWT.JsonWebToken来解码id_token,但我也通过使用google: JWT Decoder上的web托管解码器validation它是否正确解码 ,我想出了与我们目前不匹配的相同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 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("access_token"); var idToken = json.Value("id_token"); return new Tuple(accessToken,idToken); } } } 

请确保在迁移流程期间使用与初始OpenID2流程中使用的完全相同的openid.realm值:这些值中的任何不匹配(即使缺少尾部斜杠字符串)都将导致完全不同的openid标识符值。