在集线器方法上使用Authorize属性时,我无法获得SignalR连接上下文。
我可以从集线器上的自定义“授权”属性访问HttpContext
:
[Authorize("MyAuthorizationPolicy")]
public class ChatHub : Hub
在我的AuthorizationHandler
中,我可以注入IHttpContextAccessor
进入HttpRequest
,这使我可以访问令牌(位于标头中)。
但是由于方法调用未使用HttpRequest
,所以当我向方法施加Authorization属性时,我需要进入SignalR请求上下文:
[Authorize("MyAuthorizationPolicy")]
public async Task Join(Guid roomGuid)
很显然,我的IHttpContextAccessor
实例为我提供了一个空HttpContext
。如何注入“ SignalRConnectionContextAccessor
”? :)
答案 0 :(得分:0)
根据讨论here,SignalR与HTTP分离,因此您可能不想在SignalR上下文中访问HTTP上下文。
但是,我对此有一个不太好的解决方案。 SignalR集线器Context
具有类型Features
的属性IFeatureCollection
,它是字典。在上面执行LINQ:
var contextFeature = hub.Context.Features.SingleOrDefault(f => f.Key == typeof(IHttpContextFeature)).Value as IHttpContextFeature;
var httpContext = contextFeature?.HttpContext;
提醒检查httpContext
是否为空。
我不推荐这种解决方案。您应该在User
中将您的授权信息作为声明传递,可以在中心的Context
中访问。