Google OpenId Connect 迁移:在 ASP.NET 应用程序中获取 openid_id

2023-12-14

我已经阅读了大量的 Google 文档和 SO Q/A,但没有运气。我想知道是否有人按照 Google 的建议成功使用了 OpenId 到 OpenId Connect 迁移。

这就是我们以前所做的:

IAuthenticationResponse response = _openid.GetResponse();
if (response != null) {
   //omitted for brevity       
} else {
   IAuthenticationRequest req = _openid.CreateRequest("https://www.google.com/accounts/o8/id");
   req.AddExtension(new ClaimsRequest
                    {
                        Country = DemandLevel.Request,
                        Email = DemandLevel.Request,
                        Gender = DemandLevel.Require,
                        PostalCode = DemandLevel.Require,
                        TimeZone = DemandLevel.Require
                    });
   req.RedirectToProvider();
}

这是使用几年前的 DotNetOpenAuth 版本完成的。由于 Google 已弃用 OpenId 身份验证,我们正在尝试转向 OpenID Connect。这里的关键问题是:我能否以某种方式获得 OpenId 标识符(以https://www.google.com/accounts/o8/id?id=xyz)使用最新版本的 DotNetOpenAuth 库或通过任何其他方式?

我已经尝试了最新的 DotNetOpenAuth,我可以让它工作,但它给了我一个新的 ID(这是预期的)。我还通过使用此 URL 尝试了 Javascript 方式(为了可读性换行):

https://accounts.google.com/o/oauth2/auth?
    scope=openid%20profile%20email
    &openid.realm=http://localhost/palkkac/
    &client_id=//here is the client id I created in google developer console
    &redirect_uri=http://localhost/palkkac/someaspxpagehere
    &response_type=id_token%20token

我检查(使用 Fiddler)我们当前使用旧的 DotNetOpenAuth 代码发送的领域值,它是http://localhost/palkkac/。我在上面的网址中放置了相同的领域。重定向网址starts与境界值却并不完全相同。

当我重定向到一个解析 id_token 并解密它的简单页面时(使用https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=zyx端点)我得到这个:

audience    "client id is here"
email   "[email protected]"
expires_in  3597
issued_at   //some numbers here
issued_to   "client id is here"
issuer  "accounts.google.com"
user_id     "here is a sequence of numbers, my id in the OpenID Connect format that is"
verified_email  true

因此,这里没有您期望找到的 openid_id 字段的迹象,尽管消息的整个结构似乎与 Google 文档不同,例如没有标题为 sub 的字段。我想知道我是否实际上使用了错误的端点、参数或其他东西?

我一直在阅读的是迁移指南:https://developers.google.com/accounts/docs/OpenID。我跳过了第 2 步,因为它似乎是一个可选步骤。在步骤 3 中,讨论了 openid_id 字段,我希望首先将其作为概念验证。

我们在 Google 上注册了该应用程序,以便创建客户端 ID 等。现在 Google 开发控制台中还列出了许多允许的重定向 url 以及 javascript 来源。如果这些可能会扰乱系统,请告诉我,我会将其发布到此处以供审核。

旁注:我们应该将我们的应用程序移到严格的防火墙环境后面,我们需要打开端口才能在服务器端执行此操作。因此,最好使用客户端 Javascript 解决方案来访问 Google,结合 HTTPS 并将结果重定向到服务器(除非存在其他问题)。

关于同一问题还有其他资源,尽管所有这些资源似乎在服务器端使用不同的库来完成这项工作,并且似乎没有人尝试使用 Javascript:

  • Here (https://stackoverflow.com/questions/22842475/migrating-google-openid-to-openid-connect-openid-id-does-not-match)我认为通过将领域设置为与旧的 OpenId2.0 流程中的相同可以解决问题。这似乎不适用于我的情况。
  • over hereopenid_id 字段也丢失了,但这里的问题更多的是如何使用 DotNetOpenAuth 以外的库向 Google 请求 id_token。
  • and in here让 Google 返回 openid_id 字段似乎也存在类似的问题。

您可以使用 GoogleAuthentication owin 中间件。

app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions
{
    SignInAsAuthenticationType = signAs,
    AuthenticationType = "Google",
    ClientId = "xxx.apps.googleusercontent.com",
    ClientSecret = "xx",
    CallbackPath = PathString.FromUriComponent("/oauth2callback"),
    Provider = new GoogleOAuth2AuthenticationProvider
    {
        OnApplyRedirect = context =>
        {
            context.Response.Redirect(context.RedirectUri + "&openid.realm=https://mydomain.com/"); // DotNetOpenAuth by default add a trailing slash, it must be exactly the same as before
        }
    },
    BackchannelHttpHandler = new MyWebRequestHandler()
}

然后,添加一个名为 MyWebRequestHandler 的新类:

public class MyWebRequestHandler : WebRequestHandler
    {
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            var httpResponse = await base.SendAsync(request, cancellationToken);
            if (request.RequestUri == new Uri("https://www.googleapis.com/plus/v1/people/me")) return httpResponse;

            var configuration = await OpenIdConnectConfigurationRetriever.GetAsync("https://accounts.google.com/.well-known/openid-configuration", cancellationToken); // read the configuration to get the signing tokens (todo should be cached or hard coded)

            // google is unclear as the openid_id is not in the access_token but in the id_token
            // as the middleware dot not expose the id_token we need to parse it again
            var jwt = httpResponse.Content.ReadAsStringAsync().Result;
            JObject response = JObject.Parse(jwt);
            string idToken = response.Value<string>((object)"id_token"); 

            JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();

            try
            {
                SecurityToken token;
                var claims = tokenHandler.ValidateToken(idToken, new TokenValidationParameters()
                {
                    ValidAudience = "xxx.apps.googleusercontent.com",
                    ValidIssuer = "accounts.google.com",
                    IssuerSigningTokens = configuration.SigningTokens
                }, out token);

                var claim = claims.FindFirst("openid_id");
                // claim.Value will contain the old openid identifier
                if (claim != null) Debug.WriteLine(claim.Value);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
            }
            return httpResponse;
        }
    }

如果像我一样,您发现这并不简单,请通过支持这个问题来提供帮助https://katanaproject.codeplex.com/workitem/359

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google OpenId Connect 迁移:在 ASP.NET 应用程序中获取 openid_id 的相关文章

  • Nhibernate:连接表并从其他表获取单列

    我有以下表格 create table Users Id uniqueidentifier primary key InfoId uniqueidentifier not null unique Password nvarchar 255
  • 将日期时间显示为 MM/dd/yyyy HH:mm 格式 C#

    在数据库中 日期时间以 MM dd yyyy HH mm ss 格式存储 但是 我想以 MM dd yyyy HH mm 格式显示日期时间 我通过使用 String Format 进行了尝试 txtCampaignStartDate Tex
  • MYSQL 的 Google OAuth 2.0 用户 ID 数据类型

    我正在实施 Google OAuth 2 0 并注意到 Google OAuth 返回的唯一用户 ID 是21位数字长的 我想大整数 20 足以满足这种需求 但我现在看到 Google OAuth 返回的用户 ID 的长度感到困惑 关于我应
  • 通过 SharpDX 渲染 Direct2D 图像时如何使用内存流而不是文件?

    设置 考虑使用给定的临时程序SharpDX http code google com p sharpdx Direct 库的托管包装器 用于渲染位图并将其保存为 PNG namespace ConsoleApplication5 using
  • ASP.Net 应用程序中的音频/视频/文本聊天

    我需要在 ASP Net 中开发一个聊天系统 我已经浏览了很多关于类似主题的问题 但没有找到任何一个令人满意的 是否可以从头开始创建它 或者我是否需要使用一些 API 我的要求仅限于我的网站用户 可以说基于内联网 请帮我 要进行文字聊天 人
  • Web 表单中的 IRouteHandler:路由需要 HttpContext.User 的请求

    我正在尝试向 Asp Net Web Forms 应用程序添加一个非常基本的路由 在 IIS 7 下运行 集成模式 http mydomain com foo http mydomain com foo 我想显示动态页面的结果 http m
  • 从 Orchard 内的主题渲染图像

    我刚刚选择 Orchard 来构建我的博客 作为创建这个新博客的努力的一部分 我正在创建一个自定义主题 这个自定义主题同时具有 CSS 和图像 我的问题 我的问题基本上可以归结为 如何渲染属于主题一部分的图像 到目前为止我已经尝试过的 我尝
  • HTML 属性 bgcolor 已弃用:用什么代替?

    VStudio ASP NET 给出以下消息 Attribute bgcolor is considered outdated A newer construct is recommended 推荐的结构是什么 bgcolor是在一个 td
  • 在 gridview 控件中使用单选按钮

    我有一个 gridview 控件 其中使用存储过程显示数据 该网格有三列 第一列包含单选按钮 总体思路是用户应该能够从 在我的例子中 5 个单选按钮中仅选择一个单选按钮 当前功能的问题是我可以同时选择所有单选按钮 我尝试使用 groupna
  • 正则表达式最多匹配五个单词

    我有一个正则表达式 a zA Z 0 9 1 5 它验证该单词包含字母数字字符和少数特殊字符 并且长度不应超过5人物 如何使此正则表达式接受最多五个与上述正则表达式匹配的单词 a zA Z 0 9 1 5 s a zA Z 0 9 1 5
  • ASP.NET Core Serilog 未将属性推送到其自定义列

    我有这个设置appsettings json对于我的 Serilog 安装 Serilog MinimumLevel Information Enrich LogUserName Override Microsoft Critical Wr
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • oracle ExecuteNonQuery 在 ASP.Net 上冻结

    我正在尝试使用 ASP C 和 CLR 4 5 中的 Oracle 连接来运行非查询 这是我的代码 string connectionString ConfigurationManager ConnectionStrings OracleC
  • 页面中某些超链接控件上的本地化资源未发生变化

    上面是正在开发中的网站的屏幕截图 我们有一个 DropdownList 控件 并在其 SelectedIndexChanged 上进行回发 然后我们更改站点区域性 然后加载相应的资源文件 DropDownList ASP NET 代码
  • 使用内存中的单元测试 .ToListAsync()

    下面是由于内存数据库集不支持 ToListAsync 而在 ShouldNotThrow 上失败的测试 我没有方便的确切措辞 但你明白了 如果它很重要 我正在尝试模拟实体框架版本提供的数据库集 6 1 3 TestFixture publi
  • ASP.NET:如何隐藏ListBox控件垂直滚动条?

    我已经尝试过CSS 溢出 自动 这不起作用 有什么办法可以实现吗 我是否需要创建我在 ASP NET 论坛上看到的自定义控件 我会像您提到的那样创建一个自定义控件 您想要的目标是什么 创建自己的滚动条以放入列表框中
  • 计算 XML 中特定 XML 节点的数量

    请参阅此 XML
  • ASP.net Gridview 分页在 UpdatePanel 中不起作用

    虽然类似的问题已经被问过很多次了 但问题仍然没有解决 这是问题 我有一个GridView它包含在选项卡容器中AJAX控件本身位于UpdatePanel Gridview工作得很好并且其相应的方法被准确地触发 但是当我启用paging 例如
  • 有没有办法在 ASP.net 中制作像 gmail 那样的进度条?

    有没有办法在 ASP net 中制作像 gmail 那样的进度条 以下是一些基于 ASP NET 的进度栏控件 ASP NET AJAX 进度条控件 http mattberseth com blog 2008 05 aspnet ajax
  • 从 ASP .Net Web 服务访问 MSMQ 时出现权限错误

    我写了一个从消息队列读取的 Web 服务 这在卡西尼号下工作得很好 现在我已经在 IIS 下部署了该服务 当该服务尝试访问队列时 我收到一条错误消息 队列不存在或者您没有足够的权限来执行该操作 我已将 IIS 虚拟目录上的匿名访问用户设置为

随机推荐