C# 从Google OpenID迁移到新的OAuth 2
我知道已经有一些关于这方面的问题了,但我发现没有一个问题涉及到任何细节 我以前使用过自己的DotNetOpenAuth代码,但现在我决定切换到Microsoft包装器进行身份验证。总之,我找到了一个非常好的OAuth客户端: 它似乎工作得很好,但现在到了迁移部分。在我当前的登录系统中,我保存了Google返回的完整OpenID URL,格式如下: 什么 根据这里的文档,我应该能够通过新的OAuth系统以某种方式获得该值 我已经在Auth请求中包含了“openid.realm”参数C# 从Google OpenID迁移到新的OAuth 2,c#,oauth,openid,dotnetopenauth,google-oauth,C#,Oauth,Openid,Dotnetopenauth,Google Oauth,我知道已经有一些关于这方面的问题了,但我发现没有一个问题涉及到任何细节 我以前使用过自己的DotNetOpenAuth代码,但现在我决定切换到Microsoft包装器进行身份验证。总之,我找到了一个非常好的OAuth客户端: 它似乎工作得很好,但现在到了迁移部分。在我当前的登录系统中,我保存了Google返回的完整OpenID URL,格式如下: 什么 根据这里的文档,我应该能够通过新的OAuth系统以某种方式获得该值 我已经在Auth请求中包含了“openid.realm”参数 re
return BuildUri(AuthorizationEndpoint, new NameValueCollection
{
{ "response_type", "code" },
{ "client_id", _clientId },
{ "scope", string.Join(" ", scopes) },
{ "redirect_uri", returnUrl.GetLeftPart(UriPartial.Path) },
{ "state", state },
{ "openid.realm", "http://myoldopenidrealm" }
});
据我所知,这些文档应该是我所需要做的全部。我已经确保我用于OpenID2身份验证的域是相同的,并且它也与我的返回URL相同
在我完成之后,我做了这个令牌请求,据我所知,我应该在这里看到一个“open_id”字段,但我不知道如何获取它
protected override string QueryAccessToken(Uri returnUrl, string authorizationCode) {
var postData = HttpUtility.ParseQueryString(string.Empty);
postData.Add(new NameValueCollection
{
{ "grant_type", "authorization_code" },
{ "code", authorizationCode },
{ "client_id", _clientId },
{ "client_secret", _clientSecret },
{ "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");
return accessToken;
}
}
}
protectedoverride string QueryAccessToken(Uri returnUrl,string authorizationCode){
var postData=HttpUtility.ParseQueryString(string.Empty);
添加(新名称值集合)
{
{“授权类型”、“授权代码”},
{“代码”,授权代码},
{“client_id”,“clientId},
{“客户机密”,“客户机密”},
{“redirect_uri”,returnUrl.GetLeftPart(UriPartial.Path)},
});
var webRequest=(HttpWebRequest)webRequest.Create(TokenEndpoint);
webRequest.Method=“POST”;
webRequest.ContentType=“application/x-www-form-urlencoded”;
使用(var s=webRequest.GetRequestStream())
使用(var sw=新StreamWriter)
Write(postData.ToString());
使用(var webResponse=webRequest.GetResponse()){
var responseStream=webResponse.GetResponseStream();
if(responseStream==null)
返回null;
使用(变量读取器=新的流读取器(responseStream)){
var response=reader.ReadToEnd();
var json=JObject.Parse(响应);
var accessToken=json.Value(“访问令牌”);
返回accessToken;
}
}
}
这就是文档所说的,我看不到“sub”或“openid_id”字段
*来自该令牌请求的响应包括常用字段(access_token等),加上openid_id字段和标准openid Connect子字段。在此上下文中需要的字段是openid\u id和sub:sub和openid\u id字段包含在openid Connect中,而不是访问令牌中 您可以通过令牌端点(与用于检索访问令牌的端点相同)获取ID令牌,或者也可以直接从OpenID Connect身份验证请求中检索ID令牌(通过将ID_令牌添加到response_type参数,可能会保存对令牌端点的后端调用) 希望有帮助 -- 如何获取ID令牌的示例 (使用OAuth2/OpenID连接流生成的流——强烈建议使用该工具调试OAuth2/OpenID连接流)
您可以对获得的ID令牌(在本例中为“ID”)的有效负载进行base64解码,并获取所有相关的用户信息。要手动执行base 64解码,您可以使用任何在线工具(例如,请参阅)。能否详细说明如何执行此操作?不确定“此”是什么意思。假设您正在询问如何获取ID令牌,那么以下是开始的好地方:1)和2)对不起,我花了几天的时间阅读这些文档,需要一些生命线。如何使用OWIN将id\u令牌值添加到response\u type参数中?我试图通过将它包含在OApplyRedirect方法中来添加它,但得到一个错误,即该参数只允许有一个值。我可以在重定向URI上做一个替换,但这看起来像是一个黑客。如果您有任何建议,我们将不胜感激。您能提供一个代码示例吗?我假定您的意思是将
response\u type=code
替换为'response\u type=id\u token'?这就是你的意思吗?您是否需要对身份验证和验证调用都执行此操作?抱歉,spadelives,不熟悉OWIN。刚刚在我的回复中添加了一个示例(按照Doug的要求)。希望有帮助!