SignalR 身份验证问题

时间:2021-06-15 08:27:45

标签: c# asp.net-core signalr asp.net-identity

我正在开发一个 ASP.NET 核心应用程序,我需要实现与 SignalR 的聊天。 我使用带有 jwt 的 Identity 来管理登录/权限,这很好用。

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

这是我配置服务的代码

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");
});

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

1 个答案:

答案 0 :(得分:0)

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

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