【发布时间】:2014-05-30 21:19:19
【问题描述】:
我一直在研究一种将 SignalR 授权属性与自定义授权提供程序(称为 MVCAuthorization)集成的方法太复杂。所以我想知道,如何将现有的控制器和操作授权与我的 SignalR 集线器和方法集成?
【问题讨论】:
-
我现在正在回答我的问题,所以不需要回答
标签: asp.net-mvc authorization signalr
我一直在研究一种将 SignalR 授权属性与自定义授权提供程序(称为 MVCAuthorization)集成的方法太复杂。所以我想知道,如何将现有的控制器和操作授权与我的 SignalR 集线器和方法集成?
【问题讨论】:
标签: asp.net-mvc authorization signalr
我发现您可以检索 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)
{
}
}
【讨论】:
您应该覆盖管道中的现有方法
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的简单示例
【讨论】: