asp.net-core-2.0 - 在授权属性处理程序代码中访问 SignalR 连接上下文
问题描述
在集线器方法上使用 Authorize 属性时,我无法获取 SignalR 连接上下文。
我可以HttpContext
从 Hub 上的自定义 Authorization 属性访问:
[Authorize("MyAuthorizationPolicy")]
public class ChatHub : Hub
在我的AuthorizationHandler
我可以注入IHttpContextAccessor
到HttpRequest
,这使我可以访问令牌(在标题中)。
但是因为方法调用不使用,所以当我将 Authorization 属性应用于我的方法HttpRequest
时,我需要进入 SignalR 请求上下文:
[Authorize("MyAuthorizationPolicy")]
public async Task Join(Guid roomGuid)
显然,我的实例IHttpContextAccessor
给了我一个 null HttpContext
。我怎样才能注入' SignalRConnectionContextAccessor
'?:)
解决方案
根据此处的讨论,SignalR 与 HTTP 解耦,因此您可能不想在 SignalR 上下文中访问 HTTP 上下文。
但是,我确实对此有一个不优雅的解决方案。SignalR hubContext
有一个Features
type的属性IFeatureCollection
,它是一个字典。对其进行 LINQ:
var contextFeature = hub.Context.Features.SingleOrDefault(f => f.Key == typeof(IHttpContextFeature)).Value as IHttpContextFeature;
var httpContext = contextFeature?.HttpContext;
提醒检查 null httpContext
。
我不推荐这个解决方案。您应该将您的授权信息User
作为声明传递,该声明可在集线器的Context
.