7

我一直在研究将 SignalR 授权属性与自定义授权提供程序(称为 MVCAuthorization)集成的方法。所以我想知道,如何将现有的控制器和操作授权与我的 SignalR 集线器和方法集成?

4

2 回答 2

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)
    {
    }
}
于 2013-01-15T17:42:26.717 回答
1

您应该覆盖管道中的现有方法

检查 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

于 2014-05-30T13:19:19.033 回答