我已经开始从Google OpenID迁移到OpenID Connect with OAuth 2.0的过程,按照文档中所述进行。我能够成功完成从令牌端点检索openid_id和id_token中的sub的工作流程,但是当我这样做时,openid_id与我们系统中现有的标识符不匹配。这阻止了我将现有用户映射到新ID,并防止用户登录我们的应用程序(或可能被允许以其他身份登录)。该ID格式正确,但只是不匹配。
我已将openid.realm参数设置为我们现有的openid.realm,并将重定向设置为文档建议的相同方式。这在本地和我们的Azure托管环境中都发生。我正在使用JWT.JsonWebToken解码id_token,但我还通过使用谷歌上托管的解码器JWT Decoder验证它是否被正确解码,结果是我得到了与当前用户不匹配的相同OpenID标识符。我还应该注意,我尝试添加了profile范围,但没有任何区别。
我们的原始系统使用DotNetOpenAuth.OpenId,所以我认为问题不在那里。我已经检查了响应中的ClaimedIdentifier,并且它与我们在openId中保存的内容匹配,因此我们没有保存错误。
下面是我们用于生成授权请求Uri的内容。它基本上是DotNetOpenAuth.GoogleOAuth2客户端的修改版本。
这是我们用来生成令牌端点请求的内容。
我已将openid.realm参数设置为我们现有的openid.realm,并将重定向设置为文档建议的相同方式。这在本地和我们的Azure托管环境中都发生。我正在使用JWT.JsonWebToken解码id_token,但我还通过使用谷歌上托管的解码器JWT Decoder验证它是否被正确解码,结果是我得到了与当前用户不匹配的相同OpenID标识符。我还应该注意,我尝试添加了profile范围,但没有任何区别。
我们的原始系统使用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;
}
这是我们用来生成令牌端点请求的内容。
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);
}
}
}