来自.AddAzureADB2CBearer的Azure SignalR集线器授权



我几天来一直在互联网上寻找关于SignalR Hub类上的[授权]的答案。我正在使用Azure B2C对用户进行身份验证。当类没有用[Authorize]修饰时,一切都很好,但我要求用户获得授权,这样我就可以访问声明。我的所有控制器都在正确验证。

 [Authorize]
    public class SignalRHub : Hub
    {

我的SignalR服务正在Azure上运行,并在服务器上启动,如下所示:


public void ConfigureServices(IServiceCollection services)
{
 services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
                .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));
 .....
 services.AddSignalR().AddAzureSignalR(ConnectionString)
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseEndpoints(endpoint =>
            {
                .....
                endpoint.MapHub<AzureSignalRSevice.SignalRHub>("/rhub");
            });
}

调试器指示客户端何时尝试连接:

Microsoft.AspNetCore.Hosting.Diagnostics:信息:请求启动HTTP/1.1 POSThttps://localhost:44301/rhub/negotiate?negotiateVersion=10

Microsoft.AspNetCore.Authentication.JwtBear.JwtBearerHandler:信息:AzureADB2CJwtBearer未通过身份验证。失败消息:没有SecurityTokenValidator可用于令牌:{token}Microsoft.AspNetCore.Authorization.DefaultAuthorizationService:信息:授权失败。Microsoft.AspNetCore.Authentication.JwtBear.JwtBearerHandler:信息:AuthenticationScheme:AzureADB2CJwtBearer受到挑战。

客户端代码如下:

 var connection = new HubConnectionBuilder().WithUrl("https://localhost:44301/rhub", options =>
            {
                options.AccessTokenProvider = () => Task.FromResult(token);
            }).Build();

我读过的所有文章都说,令牌是作为参数传递的,但在我的例子中,它是在Authorization标头中正确发送的。

我已经尝试配置JwtBearerOptions并将令牌传递到上下文。令牌,但是我得到相同的身份验证失败。

services.Configure<JwtBearerOptions>(AzureADB2CDefaults.JwtBearerAuthenticationScheme, options =>
           {
}

OnChallenge在上下文中使用invalid_token失败时被命中。

所有软件包都是在Core 3.1.2 上运行的最新软件包

我看过很多文章,这是迄今为止最好的https://github.com/dotnet/aspnetcore/issues/10582

它不使用B2C认证。

我已经开始工作了!解决方案包括身份验证方案

 [Authorize(AuthenticationSchemes = AzureADB2CDefaults.BearerAuthenticationScheme + ", " + AzureADB2CDefaults.JwtBearerAuthenticationScheme)]
public class SignalRHub : Hub
    {
}

最新更新