2017-01-25 2 views
0

Je travaille sur un SignalR.Hub et j'ai une autorisation personnalisée dans un SignalR.AuthorizeAttribute. J'ai essayé de passer la session que je dois récupérer pour confirmer que l'utilisateur est authentifié pour utiliser le hub.Obtenir une session de SignalR.AuthorizeAttribute à SignalR.Hub

J'ai parcouru toutes les propriétés et il semble qu'elles soient principalement en lecture seule. Je peux ajouter quelque chose à SignalR.IRequest.Environment mais il ne semble pas être sûr pour les threads et semble incorrect.

Puis-je étendre le HubCallerContext + Tout ce qui l'utilise d'une manière que je peux virer sur ma session?

Le auth personnalisé

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class HubAuthorize : AuthorizeAttribute 
{ 
    public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
    { 
     return VerifySession(request); 
    } 

    public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubIncomingInvokerContext, bool appliesToMethod) 
    { 
     //Could I add something to the HubIncomingInvokerContext? 
     return VerifySession(hubIncomingInvokerContext.Hub.Context.Request); 
    } 

    public bool VerifySession(IRequest request) 
    { 
     bool success = false; 
     string token = ""; 
     bool isApiToken = false; 

     // Check for token Header Auth 
     if (string.IsNullOrWhiteSpace(token)) 
     { 
      token = request.QueryString["X-Custom-Token"]; 
      if (string.IsNullOrWhiteSpace(token)) 
      { 
       token = request.QueryString["X-Custom-Token"]; 
       isApiToken = true; 
      } 
     } 

     SessionResponse session = null; 
     if (!string.IsNullOrWhiteSpace(token)) 
     { 
      session = isApiToken ? ValidateApiToken(token) : ValidateToken(token); 
     } 

     if (session != null) 
     { 
      //Add Session to request! So I dont have to hit the db again.. 
      //request.Add(new KeyValuePair<string, object>("session", session)); 
      success = true; 
     } 
     return success; 
    } 

    //... other methods that aren't relevant 
} 

Le Hub

[HubAuthorize] 
public class NotificationHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     // Use the session here 
     Clients.All.broadcastMessage(name, message); 
    } 

    public override Task OnConnected() 
    { 
     Console.WriteLine(Context.ConnectionId); 
     return base.OnConnected(); 
    } 
} 

Pourquoi avoir l'autorisation personnalisée si vous ne pouvez pas l'utiliser pour récupérer une session lorsque vous vérifiez que vous êtes authentifié? Peut-être que je manque quelque chose mais c'est plutôt frustrant./endrant

Répondre

0

Semble que vous ne pouvez pas. Je vérifie toujours la session dans HubAuthorize.AuthorizeHubConnection, puis dans le NotificationHub.OnConnected je construis un dictionnaire de Context.ConnectionId comme clé et récupère la session une seconde fois pour la valeur. On se sent hackish mais il ne semble pas y avoir un bon moyen d'empêcher les gens d'accéder au hub sans utiliser l'authentification .Net intégrée.