首页 > 解决方案 > 在授权属性处理程序代码中访问 SignalR 连接上下文

问题描述

在集线器方法上使用 Authorize 属性时,我无法获取 SignalR 连接上下文。

我可以HttpContext从 Hub 上的自定义 Authorization 属性访问:

[Authorize("MyAuthorizationPolicy")]
public class ChatHub : Hub

在我的AuthorizationHandler我可以注入IHttpContextAccessorHttpRequest,这使我可以访问令牌(在标题中)。

但是因为方法调用不使用,所以当我将 Authorization 属性应用于我的方法HttpRequest时,我需要进入 SignalR 请求上下文:

[Authorize("MyAuthorizationPolicy")]
public async Task Join(Guid roomGuid)

显然,我的实例IHttpContextAccessor给了我一个 null HttpContext。我怎样才能注入' SignalRConnectionContextAccessor'?:)

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

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

解决方案


根据此处的讨论,SignalR 与 HTTP 解耦,因此您可能不想在 SignalR 上下文中访问 HTTP 上下文。

但是,我确实对此有一个不优雅的解决方案。SignalR hubContext有一个Featurestype的属性IFeatureCollection,它是一个字典。对其进行 LINQ:

var contextFeature = hub.Context.Features.SingleOrDefault(f => f.Key == typeof(IHttpContextFeature)).Value as IHttpContextFeature;
var httpContext = contextFeature?.HttpContext;

提醒检查 null httpContext

我不推荐这个解决方案。您应该将您的授权信息User作为声明传递,该声明可在集线器的Context.


推荐阅读