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 中的范围服务
.net core 3.0 Signalr - 01 基础篇