我正在尝试使用此项目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
具有相同的结果。
谢谢。
答案 0 :(得分:3)
好的,我让它运转了。对于那些到达类似问题的人来说,上面的代码运行良好,没有问题。无需在服务器端添加任何内容(即此代码)
问题在于信号器初始化和来自客户端的调用。不知何故,我认为没有信号器可以在没有首先击中属性的情况下击中集线器。显然有!我只是改变了我的angularjs代码,它可以工作。