SignalR 身份验证问题

SignalR authentication issue

我正在开发 ASP.NET 核心应用程序,我需要使用 SignalR 实现聊天。 我使用 Identity 和 jwt 来管理 login/permissions,这工作正常。

我按照 this docs 在 SignalR hub 中实现身份验证,但它不起作用,即使在 hub 上使用 [Authorize] 属性也可以访问我的 hub 功能。

这是我配置服务的代码

services
    .AddAuthorization()
    .AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddJwtBearer(options =>
    {
        options.RequireHttpsMetadata = false;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidIssuer = jwtSettings.Issuer,
            ValidAudience = jwtSettings.Issuer,
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSettings.Secret)),
            ClockSkew = TimeSpan.Zero
        };
        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("/chat")))
                {
                    // Read the token out of the query string
                    context.Token = accessToken;
                }

                return Task.CompletedTask;
            }
        };
    });

这是我的集线器代码

[Authorize]
public class Chat : Hub<IChatClientMethods>
{
    private readonly ProjectHubContext _context;
    private readonly UserManager<User> _userManager;
    public Chat(ProjectHubContext context, UserManager<User> userManager) : base()
    {
        _context = context;
        _userManager = userManager;
    }
    
    // This method is executed even with the [Authorize] attribute
    public override async Task OnConnectedAsync()
    {
        await base.OnConnectedAsync();
        Console.WriteLine("Connected");
        var user = await _userManager.GetUserAsync(Context.User); //Always null
    }
}

最后是中心映射

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();
    endpoints.MapHub<Chat>("/chat");
});

为什么我在提供随机测试令牌时可以从客户端调用集线器功能?

我发现了为什么我的 [Authorize] 标签不起作用。

我用错了。 我用了 using MiNET.Plugins.Attributes; 而不是 using Microsoft.AspNetCore.Authorization;