SignalR Core 中默认授权所有集线器

Posted

技术标签:

【中文标题】SignalR Core 中默认授权所有集线器【英文标题】:Authorization for all hubs by default in SignalR Core 【发布时间】:2019-08-10 22:55:24 【问题描述】:

我正在开发带有 JWT 身份验证的 ASP.Net Core 2.2 Web Service + SignarR Core,并希望确保只能使用有效令牌访问我的所有集线器。

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

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

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

【问题讨论】:

【参考方案1】:

对于授权用户的全局检查,您可以尝试

选项1:配置中间件在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


 

【讨论】:

【参考方案2】:

您可以通过向路由添加授权数据来做到这一点。

app.UseSignalR(routes =>

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

【讨论】:

这对我不起作用

以上是关于SignalR Core 中默认授权所有集线器的主要内容,如果未能解决你的问题,请参考以下文章

带有 SignalR 集线器的 ASP.NET Core 中的范围服务

SignalR .Net Core 多连接

建立连接时的 SignalR Core 调用函数

.net core 3.0 Signalr - 01 基础篇

.net core 3.0 Signalr - 01 基础篇

如何在 hubpipleline 之外使用 SignalR 集线器实例