2013-12-18 7 views
7

Ich verwende WebApi und tokenbasierte Authentifizierung für meine API-Controller. (Autorisierung: Bearer xyzabc ..) Ich habe jetzt einen SignalR Hub und möchte Clients mit dem gleichen Token authentifizieren, die sie auf dem Client haben Seite.Autorisierungs-Header in SignalR 2.0

Wie würde ich das tun? Diese link zeigt, wie Token über URL-Parameter zu senden, aber ich bin mir nicht sicher, wie ich dieses Token verwenden und den Benutzer auf der Serverseite authentifizieren kann.

Antwort

0

Ich würde das Token nicht jedes Mal senden. Ich würde Ihren Kontextbenutzerprinzipal in der OnConnected-Methode virtuell einrichten und aus einer Abfragezeichenfolge lesen, die von einem Token übergeben wird.

In meinem Fall. Ich habe gerade eine abstrakte Klasse erstellt, die von der Hub-Klasse geerbt hat und dann meine eigene Logik zur Erzeugung von Ansprüchen dort eingefügt hat. Dann haben meine regulären Beton-Hubs nur von meiner Base-Custom-Hub-Klasse geerbt.

Eine andere Option wäre die Verwendung eines benutzerdefinierten Autorisierungsattributs oder eines anderen Hub-Pipeline-Moduls.

Ich denke, diese Taktiken können Ihren Code trocken und erweiterbar halten.

2

Ich löste dies, indem ich das Token als Parameter meiner Hub-Methode anstelle von Header übergab. aber ich stelle mir vor, es ist möglich, es auch mit Kopfzeilen zu tun (nur das Token aus Context.Headers oder etwas zu extrahieren).

In beiden Fällen, nach Erhalt des Tokens in Ihrer Hub-Methode, verwenden Sie einfach diesen Code.

public Task SendMessage(string message, string token) 
    { 
     var ticket = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token); 
     bool isAuth = ticket.Identity.IsAuthenticated; 
     //You can retrieve other details like username and userid from ticket 
     ...rest of your code.. 
    } 
0

Ich habe festgestellt, dass beim Aufruf des Standard/Token-Handlers von der Web-API aus etwas wie JQuery, der Browser auch ein Cookie gesendet wird, mit dem Sie mit SignalR authentifiziert werden.

Sie sollten das Attribut [Autorisieren] sowie "Context.User.Identity" in Ihren SignalR-Hub-Methoden verwenden können, um den aktuellen Benutzer zu erhalten, solange Sie/Token mit gültigen Anmeldeinformationen aus aufgerufen haben Browser vor dem Verbinden mit dem Hub.