我有一个带有一些控制器和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对象无法让我访问身份验证事件。
如何协调两种方法?
答案 0 :(得分:0)
也许可以通过编写自己的AuthenticationHandler来获得更多手册。您可以使用.AddAuthorization和.AddAuthentication的IServiceCollection扩展来编写自己的逻辑,以完成应该发生的事情。
在后dotnet核心世界中,我在使用C#时发现,只需使用它们所需的框架就很少了。框架的东西简直是脆弱而脆弱,在5年内,它们全部重做了3次,没有人能够在每个Startup.cs中维护5岁的流利的古怪流利的构建器东西。
编写自己的AuthenticationHandler是在使用单行流利的构建器扩展方法与完全忽略整个框架并编写使用逻辑和理由的自己的框架之间的一种很好的折衷。