授权属性处理程序代码中的访问SignalR连接上下文

时间:2019-03-08 14:15:44

标签: asp.net-core-2.0 asp.net-core-signalr asp.net-authorization

在集线器方法上使用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”? :)

https://github.com/aspnet/Docs/issues/11331

1 个答案:

答案 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中访问。