OnConnected上的SignalR Context.User为空

OnConnected上的SignalR Context.User为空

问题描述:

我正在使用Angularjs和Asp.net Web API的UI应用程序。对于实时更新,我使用SignalR。 Web API和SignalR由不同的进程托管。 Web API将认证用户并返回令牌。我将查询字符串中的相同标记发送给SignalR进行授权。授权代码成功运行,但Context.User在OnConnected方法内为null,但在注册中心方法中,主体已正确设置。OnConnected上的SignalR Context.User为空

请找到下面的代码。预先感谢您的帮助。

[TokenAuthorize] 
public class MyHub : Hub 
{ 
    public void Register(string token) 
    { 
     // Context.User is set to the appropiate principal 
    } 

    public override Task OnConnected() 
    { 
     //Context user is set to null 
    return base.OnConnected(); 
    } 

    public override Task OnDisconnected(bool stopCalled) 
    { 
     return base.OnDisconnected(stopCalled); 

    } 
} 

public class TokenAuthorizeAttribute : AuthorizeAttribute 
{ 

    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     var tokenId = request.QueryString.Get("Token"); 
     try 
     { 
      var principal = TokeService.ValidateToken(tokenId); 
      if (principal != null) 
      { 
       Thread.CurrentPrincipal = principal; 
       request.Environment["server.User"] = principal; 

       return true; 
      } 
     } 
     catch (Exception) 
     { 
      return false; 
     }   

     return false; 

    } 

    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; 
    } 


    protected override bool UserAuthorized(System.Security.Principal.IPrincipal user) 
    { 
     if (user == null) 
     { 
      throw new ArgumentNullException("user"); 
     } 

     var principal = user as ClaimsPrincipal; 

     if (principal != null) 
     { 
      Claim authenticated = principal.FindFirst(ClaimTypes.Authentication); 
      if (authenticated != null && authenticated.Value == "true") 
      { 
       return true; 
      } 
      else 
      { 
       return false; 
      } 
     } 
     else 
     { 
      return false; 
     } 
    } 
} 
+0

为什么你不使用singalr作为消息发送它? – cpoDesign

它有可能是与其中signalr配置身份验证配置和Web API配置的调用顺序。您必须在配置web api之前调用mapsignalr。不幸的是,我不知道如何在mapsignalr函数之前调用web api的配置。因为我的web api配置是从global.asax触发的GlobalConfiguration.Configure(WebApiConfig.Register);