2016-08-08 9 views
0

У меня есть мобильное приложение, использующее Facebook Auth через лазурь. Auth отлично работает для ApiControllers с флагом [MobileApiController].Как я могу разрешить концентратор SignalR с использованием аутентификации Azure Mobile Apps

Я не могу найти, как сделать мой авторизатор SignalR авторизированным - атрибут Authorize блокирует доступ пользователей. Все статьи, которые я нашел, кажутся старыми и используют устаревшие Azure Mobile Services, которые отличаются и несовместимы.

Я настроил свой клиент SignalR для подключения как долгого опроса с помощью набора заголовков x-zumo-auth.

+0

Можете ли вы поделиться кодом атрибута '[MobileApiController]'? Можно получить атрибут SignalR '[Authorize]' и предоставить настраиваемую авторизацию. –

+0

@MarkC. '[MobileApiController]' поступает из библиотеки Azure в пространстве имен 'Microsoft.Azure.Mobile.Server.Config' – Sam

+0

OK Я только что узнал, что' MobileApiController' не имеет ничего общего с аутентификацией. Передача всех заголовков zumo в signalr не помогает с авторизацией – Sam

ответ

1

В результате я создал собственный атрибут аутентификации SignalR. Код ниже для всех, кого интересует.

public class HubAuthorizeAttribute : AuthorizeAttribute 
    { 
    public HubAuthorizeAttribute() 
    { 
    } 

    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     var owinContext = request.GetHttpContext().GetOwinContext(); 

     ClaimsPrincipal claimsPrincipalFromToken; 
     var options = Startup.AuthenticationOptions; 

     string tokenFromHeader = request.Headers[AppServiceAuthenticationHandler.AuthenticationHeaderName]; 
     if (!string.IsNullOrEmpty(tokenFromHeader)) 
     { 
      bool claimsAreValid = options.TokenHandler.TryValidateLoginToken(tokenFromHeader, options.SigningKey, options.ValidAudiences, options.ValidIssuers, out claimsPrincipalFromToken); 
      if (claimsAreValid) 
      { 
       var identity = claimsPrincipalFromToken.Identity as ClaimsIdentity; 

       request.Environment["server.User"] = new ClaimsPrincipal(identity); 
       return true; 
      } 
     } 

     return false; 
    } 

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     var connectionId = hubIncomingInvokerContext.Hub.Context.ConnectionId; 
     // check the authenticated user principal from environment 
     var environment = hubIncomingInvokerContext.Hub.Context.Request.Environment; 
     var principal = environment["server.User"] as ClaimsPrincipal; 
     if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated) 
     { 
      // create a new HubCallerContext instance with the principal generated from token 
      // and replace the current context so that in hubs we can retrieve current user identity 
      hubIncomingInvokerContext.Hub.Context = new HubCallerContext(new ServerRequest(environment), connectionId); 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 
}