我几天来一直在互联网上寻找关于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
{
}