我一直致力于将SignalR授权属性与自定义授权提供程序(称为MVCAuthorization)集成在一起。我试图重新创建一个专门用于集线器的授权提供程序的一些漏洞,但结果证明是远远不够的太复杂。所以我想知道如何将现有的Controller和Action Authorization与我的SignalR Hubs和方法集成?
答案 0 :(得分:10)
我发现您可以检索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)
{
}
}
答案 1 :(得分:1)
您应该覆盖管道中的现有方法
Check authorize in SignalR attribute
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
的简单示例