C# 从Google OpenID迁移到新的OAuth 2

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

我知道已经有一些关于这方面的问题了,但我发现没有一个问题涉及到任何细节

我以前使用过自己的DotNetOpenAuth代码,但现在我决定切换到Microsoft包装器进行身份验证。总之,我找到了一个非常好的OAuth客户端:

它似乎工作得很好,但现在到了迁移部分。在我当前的登录系统中,我保存了Google返回的完整OpenID URL,格式如下:

什么

根据这里的文档,我应该能够通过新的OAuth系统以某种方式获得该值

我已经在Auth请求中包含了“openid.realm”参数

    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连接流)

  • 选择(例如)Oauth2 API v2 userinfo.email范围
  • 单击授权API
  • 批准OAuth2请求
  • 按“交换代币授权码”按钮 您可以看到所有http请求/响应。有趣的是,对谷歌令牌API调用的响应包含

    { “访问令牌”:“ya29.XYZ”, “令牌类型”:“承载者”, “expires_in”:3600, “刷新令牌”:“1/KgXYZ”, “id_令牌”:“my.id.token” }


    您可以对获得的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的要求)。希望有帮助!