默认情况下,SignalR Core中对所有集线器的授权

时间:2019-03-20 09:31:49

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

我正在使用具有JWT身份验证的ASP.Net Core 2.2 Web服务+ SignarR Core,希望确保仅使用有效令牌才能访问我的所有集线器。

我可以在所有集线器上设置[Authorize]属性以确保这一点,但是默认情况下可以要求授权(否则将来在实现新集线器时可能会忘记它)。

就像我可以为控制器做的一样:

services.AddMvc(config =>
                        {
                            var policy = new AuthorizationPolicyBuilder()
                                         .RequireAuthenticatedUser()
                                         .Build();
                            config.Filters.Add(new AuthorizeFilter(policy));
                        })

2 个答案:

答案 0 :(得分:1)

要全局检查授权用户,可以尝试

Options1:将中间件配置为在signalR之前授权

app.Use(async (context, next) =>
    {
        if (context.User.Identity.IsAuthenticated)
        {
            await next.Invoke();
        }
        else
        {
            context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
        }
    });
app.UseSignalR(routes =>
{
    routes.MapHub<ChatHub>("/hubs/chat");
});  

选项2:实现基本集线器以及从该基本集线器继承的其他集线器

[Authorize]
public class AuthorizeHub:Hub
{

}
public class OtherHub: AuthorizeHub
{

} 

答案 1 :(得分:0)

您可以通过向路由添加授权数据来实现。

app.UseSignalR(routes =>
{
   routes.MapHub<BackgroundServiceHub>("/hubs", o =>
   {
      o.AuthorizationData.Add(new AuthorizeAttribute());
   });
});