2015-02-22 4 views
2

Я пытаюсь разрешить запросы SignalR именно с использованием примера проекта здесь AngularJS Authentication на основе этого проекта AngularJS Authentication using web tokens. Проблема я имею, использовать авторизацию SignalR, мне пришлось переопределить класс SignalR AuthorizeAttribute, как показано ниже:SignalR Авторизация с использованием Web API Token

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

Идея заключается в том, когда сигнал соединения signalr попадает в этот класс, AuthorizeHubConnection должен запускать и разрешать его. Однако этот метод никогда не называется. Второй метод называется AuthorizeHubMethodInvocation.

Что я делаю неправильно? Почему это переопределение не работает? Кстати, я пробовал наследовать таким образом: QueryStringBearerAuthorizeAttribute : Attribute, IAuthorizeHubConnection, IAuthorizeHubMethodInvocation с тем же результатом.

спасибо.

ответ

4

Хорошо, у меня это работает. Для тех, кто работает здесь по аналогичным вопросам, код выше работает хорошо, с ним нет проблем. Ничего не нужно добавлять на стороне сервера (т.е. на этот код)

Проблема была в инициализации signalr и вызове со стороны клиента. Я почему-то предполагал, что сигнал не может попасть в хаб, не нажимая сначала атрибут. Очевидно, что есть! Я просто изменил свой код angularjs, и он работает.

+5

... вы изменили его на то, что именно? У меня есть аналогичная проблема, но у меня есть 'connection.start()' на стороне клиента, поэтому я не уверен, что мне здесь не хватает ... – veljkoz

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