如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?

Posted

技术标签:

【中文标题】如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?【英文标题】:How to validate Azure AD B2C token from query string in Asp.net Core? 【发布时间】:2019-10-07 21:25:12 【问题描述】:

我有一个带有一些控制器和一个 signalR 集线器的 asp.net web api 应用程序。 Azure AD B2C 的 JWT 令牌验证配置如下:

services.AddAuthentication(AzureADB2CDefaults.JwtBearerAuthenticationScheme)
        .AddAzureADB2CBearer(options => _configuration.Bind("AzureAdB2C", options))

这适用于控制器,我不必担心the intricacies of Azure AD B2C token validation。

现在,要让 signalR 集线器支持 Web 套接字或服务器发送的事件,the authentication token should be read from the querystring。我应该像这样处理 OnMessageReceived 事件:

services.AddAuthentication(...)
    .AddJwtBearer(options =>
        
            options.Events = new JwtBearerEvents
            
                OnMessageReceived = context =>
                
                    var accessToken = context.Request.Query["access_token"];

                    // If the request is for our hub...
                    var path = context.HttpContext.Request.Path;
                    if (!string.IsNullOrEmpty(accessToken) &&
                        (path.StartsWithSegments("/hubs/chat")))
                    
                        // Read the token out of the query string
                        context.Token = accessToken;
                    
                    return Task.CompletedTask;
                
            ;
        );

不幸的是,AzureAdB2COptions 对象不允许我访问身份验证事件。

如何调和这两种方法?

【问题讨论】:

解决了吗?正是我面临的问题。 这有什么更新吗?我也遇到了这个问题。 【参考方案1】:

也许可以通过编写自己的 AuthenticationHandler 来获得更多的手册。您可以使用 .AddAuthorization 和 .AddAuthentication 的 IServiceCollection 扩展来编写自己的逻辑来执行应该发生的事情。

我在后 dotnet 核心世界中使用 C# 发现的东西,尽可能少地使用它们的框架来连接它。框架的东西都是笨拙而脆弱的,在 5 年内,当他们重做 3 次时,没有人能够维护每个 Startup.cs 中奇怪的 5 年流利的 builder 东西。

编写自己的 AuthenticationHandler 是使用单行流畅的构建器扩展方法与完全忽略整个框架和编写自己的使用逻辑和推理的框架之间的一个很好的折衷。

【讨论】:

以上是关于如何从 Asp.net Core 中的查询字符串验证 Azure AD B2C 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 ASP.NET Core 支持绑定查询字符串中的数组

如何让 ASP.NET Core 支持绑定查询字符串中的数组

ASP.NET Core Web API - 如何处理 URL 查询字符串中的“null”与“undefined”?

问:如何在 ASP.NET Core 中执行查询字符串?

QueryString.Add 不向 ASP.NET Core 中的请求查询字符串添加值

如何使用 ASP.NET Core 将查询字符串参数转换为看起来像目录部分?