首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Google OpenID迁移到OpenID连接: openid_id不匹配

将Google OpenID迁移到OpenID连接: openid_id不匹配
EN

Stack Overflow用户
提问于 2014-04-03 15:37:05
回答 1查看 1.4K关注 0票数 6

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

我已经将openid.realm参数设置为现有的openid.realm,并按照文档的建议设置了重定向。这既发生在本地,也发生在我们的蔚蓝托管环境中。我正在使用JWT.JsonWebToken来解码id_token,但我也验证了它是通过使用google:JWT解码器上托管的网络解码器正确解码的,并且我想出了一个与我们目前为该用户提供的OpenID标识符不匹配的OpenID标识符。我还应该指出,我也尝试过添加配置文件范围,但这并没有造成任何不同。

我们使用DotNetOpenAuth.OpenId作为我们的原始系统,所以我不认为问题就在那里。我已经检查了作为响应的一部分的ClaimedIdentifier,它确实与我们为openId保存的系统中的内容相匹配,所以我们没有错误地保存它。

下面是我们用于为auth请求生成Uri的内容。它主要是DotNetOpenAuth.GoogleOAuth2客户机的修改版本。

代码语言:javascript
复制
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;
        }

下面是我们用来生成对令牌端点的请求的内容。

代码语言:javascript
复制
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);
            }
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-14 03:49:41

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22842475

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档