gpt4 book ai didi

c# - 将 Google OpenID 迁移到 OpenID Connect : openid_id does not match

转载 作者:太空狗 更新时间:2023-10-29 21:50:16 26 4
gpt4 key购买 nike

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

我已将 openid.realm 参数设置为我们现有的 openid.realm,并将重定向设置为与文档建议的相同。这在本地和我们的 Azure 托管环境中都在发生。我正在使用 JWT.JsonWebToken 来解码 id_token,但我还通过使用 google 上的网络托管解码器验证了它是否被正确解码:JWT Decoder ,我想出了与我们当前为该用户拥有的标识符不匹配的相同 OpenID 标识符。我还应该注意,我也尝试过添加配置文件范围,但这没有任何区别。

我们的原始系统使用的是 DotNetOpenAuth.OpenId,因此我认为问题不在于此。我检查了作为响应一部分的 ClaimedIdentifier,它确实与我们在系统中为 openId 保存的内容匹配,因此我们没有错误地保存它。

下面是我们用来为身份验证请求生成 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;
}

这是我们用来生成对 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);
}
}
}

最佳答案

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

关于c# - 将 Google OpenID 迁移到 OpenID Connect : openid_id does not match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22842475/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com