SignalR 1.0 引入了对此的支持,您可以在David Fowlers 博客上阅读一些相关信息。问题是,它太新了,文档很少。
我不确定您的应用程序目前正在发生什么,但您可以在 Stack Overflow 上找到一个类似的问题,这可能会帮助您走上正确的轨道:Integrating SignalR with existing Authorization
基本上,您可以创建一个实现 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);
}
}
或者,您可以将 HubAuthorizeAttribute 添加为 HubPipeline 模块以全局要求授权。
var globalAuthorizer = new HubAuthorizeAttribute ();
GlobalHost.HubPipeline.AddModule(new AuthorizeModule(globalAuthorizer, globalAuthorizer));