我发现你可以检索一个IAuthorization提供者。
如果您将集线器视为控制器,并将您的方法视为您的操作,那么您所要做的就是创建一个实现IAuthorizeHubConnection和IAuthorizeHubMethodInvocation的SignalR属性
public class HubAuthorizeAttribute : Attribute, IAuthorizeHubConnection,IAuthorizeHubMethodInvocation { public virtual bool AuthorizeHubConnection(HubDescriptor hubDescriptor, Microsoft.AspNet.SignalR.IRequest request) { IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>(); return authorizationProvider.IsAuthorizedController(hubDescriptor.Name); } public virtual bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext) { IAuthorizationProvider authorizationProvider = DependencyResolver.Current.GetService<IAuthorizationProvider>(); return authorizationProvider.IsAuthorizedAction(hubIncomingInvokerContext.MethodDescriptor.Hub.Name, hubIncomingInvokerContext.MethodDescriptor.Name); } }
然后,您所要做的就是将属性放在集线器或您想要授权的任何方法上
[HubAuthorize] public class Message : Hub { public void Send(string message) { } }
您应该覆盖管道中的现有方法
检查SignalR属性中的授权
http://www.asp.net/signalr/overview/signalr-20/security/hub-authorization
重写AuthorizeHubMethodInvocation将允许您在覆盖UserAuthorized时授权请求,允许您进行身份验证(您可以检查用户的角色等)
让HubAuthorizeAttribute从AuthorizeAttribute继承并允许构造函数接受角色列表
这是一个关于如何处理角色的简单示例 http://www.jasonwatmore.com/post/2014/02/18/ASPNET-Web-API-2-Enum-Authorize-Attribute.aspx