将SignalR与现有授权集成

时间:2013-01-15 17:39:06

标签: asp.net-mvc authorization signalr

我一直致力于将SignalR授权属性与自定义授权提供程序(称为MVCAuthorization)集成在一起。我试图重新创建一个专门用于集线器的授权提供程序的一些漏洞,但结果证明是远远不够的太复杂。所以我想知道如何将现有的Controller和Action Authorization与我的SignalR Hubs和方法集成?

2 个答案:

答案 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

的简单示例