2015-12-21 4 views
3

Я работаю над пользовательским интерфейсом, использующим веб-API Angularjs и Asp.net. Для обновлений в реальном времени я использую SignalR. Web API и SignalR размещаются в отдельных процессах. Web API будет аутентифицировать пользователя и вернуть токен. Я посылаю тот же токен в строке запроса в SignalR для авторизации. Код авторизации запускается успешно, но Context.User имеет значение null в методе OnConnected, но в рамках метода концентратора Register основной элемент установлен правильно.SignalR Context.User is null on OnConnected

Пожалуйста, найдите код ниже. Заранее благодарю за любую помощь.

[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

ответ

0

Это может быть связано с порядком, в котором вызывается конфигурация конфигурации конфигурации signalr и конфигурация web-api. Вы должны вызвать mapignalr перед конфигурацией веб-api. К сожалению, я не знаю, как вызвать конфигурацию веб-api перед функцией mapsignalr. потому что моя конфигурация веб-api запускается из global.asax GlobalConfiguration.Configure(WebApiConfig.Register);

Смежные вопросы