使用Web API令牌进行SignalR授权

时间:2015-02-22 20:32:47

标签: angularjs asp.net-web-api signalr asp.net-identity-2

我正在尝试使用此项目AngularJS Authentication基于此项目AngularJS Authentication using web tokens准确授权SignalR请求。我遇到的问题是,要使用SignalR授权,我必须覆盖SignalR AuthorizeAttribute类,如下所示:

public class QueryStringBearerAuthorizeAttribute : AuthorizeAttribute
{
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request)
    {
        var token = request.QueryString.Get("Bearer");
        var authenticationTicket = Startup.AuthServerOptions.AccessTokenFormat.Unprotect(token);

        if (authenticationTicket == null || authenticationTicket.Identity == null || !authenticationTicket.Identity.IsAuthenticated)
        {
            return false;
        }

        request.Environment["server.User"] = new ClaimsPrincipal(authenticationTicket.Identity);
        request.Environment["server.Username"] = authenticationTicket.Identity.Name;
        request.GetHttpContext().User = new ClaimsPrincipal(authenticationTicket.Identity);
        return true;
    }

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod)
    {
        var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId;
        var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment;
        var principal = environment["server.User"] as ClaimsPrincipal;

        if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated)
        {
            hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment), connectionId);

            return true;
        }

        return false;
    }
}

现在我的中心如下:

[QueryStringBearerAuthorize]
[HubName("realtime")] 
public class WislerAppHub : Hub
{
    public string GetServerTime()
    {            
        return DateTime.UtcNow.ToString();
    }       
}

这个想法是,当信号器连接请求到达此类时,AuthorizeHubConnection应该触发并授权它。但是从不调用此方法。第二种方法是AuthorizeHubMethodInvocation

我做错了什么?为什么这个覆盖不起作用?顺便说一下,我尝试继承:QueryStringBearerAuthorizeAttribute : Attribute, IAuthorizeHubConnection, IAuthorizeHubMethodInvocation具有相同的结果。

谢谢。

1 个答案:

答案 0 :(得分:3)

好的,我让它运转了。对于那些到达类似问题的人来说,上面的代码运行良好,没有问题。无需在服务器端添加任何内容(即此代码)

问题在于信号器初始化和来自客户端的调用。不知何故,我认为没有信号器可以在没有首先击中属性的情况下击中集线器。显然有!我只是改变了我的angularjs代码,它可以工作。