2017-06-09 3 views
0

Ich habe meine SignalR Dienst auf URL veröffentlicht http://localhost/signalrSignalR - dynamische URL?

public class ChatHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.sendMsg(name, message); 
    } 
} 

Ich brauche keine Anrufe an den Dienst zu beschränken, dass die URL eine eindeutige ID haben müssen, zum Beispiel http://localhost/signalr/123 und dann kann ich die Send Methode aufrufen.

Also, gibt es eine Möglichkeit, etwas wie die URL-Routing hier zu verwenden? Und wie kann ich diese ID erhalten, bevor ich auf diese Methode zugreife?

Antwort

1

Die URLs in SignalR-Anfragen gelten nur für die ersten Setup-Anrufe. Diese Anfangseinstellungsanforderungspfade werden von der SignalR-Bibliothek formatiert, Sie können den SignalR-Anforderungen jedoch Abfragezeichenfolgenparameter hinzufügen. Tun Sie dies, indem Sie in Ihrem JavaScript-Client die folgende Codezeile hinzufügen, bevor Sie $ .connection.hub.start aufrufen.

$.connection.hub.qs = { 'X-UniqueID': 123 }; 

Dann eine Verbindung zu genehmigen auf der Grundlage dieser speziellen ID Sie benutzerdefinierte Auth für die SignalR Hub tun würde (beachten Sie, dass der Microsoft-Artikel zu diesem Thema: https://docs.microsoft.com/en-us/aspnet/signalr/overview/security/hub-authorization viele Informationen fehlen, jedoch habe ich gepostet ein Kommentar unten mit den notwendigen Informationen, wie Sie es tun können). Das erreichen Sie folgendermaßen:

1) Fügen Sie Ihrem Projekt eine Klasse mit dem Namen CustomAuthAttribute hinzu und erben Sie von Microsoft.AspNet.SignalR.AuthorizeAttribute, und geben Sie der Klasse die erforderlichen Dekore.

2) Überschreiben Sie die AuthorizeHubConnection-Methode und validieren Sie die Anfrage basierend auf der Abfragezeichenfolge.

3) Sie können AuthorizeHubMethodInvocation auch überschreiben, um jede Web-Socket-Anfrage zu überprüfen.

4) Dekorieren Sie Ihre Hub-Klasse mit dem CustomAuth-Tag.

Am Ende der Klasse wie folgt aussehen:

[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = false)] 
public class CustomAuthAttribute : AuthorizeAttribute 
public override bool AuthorizeHubConnection(HubDescriptor hubDescriptor, IRequest request) 
{ 
    if (request.QueryString["X-UniqueID"] == "123") 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

public override bool AuthorizeHubMethodInvocation(IHubIncomingInvokerContext hubContext, bool appliesToMethod) 
{ 
    return true; // or do some validation 
} 

Und Ihre Nabe sollte wie folgt aussehen:

[CustomAuth] 
public class myHub : Hub //Or some other name 

Nun, wenn Sie Einstellung tatsächlich eine Art eindeutigen ID auf jedem web socket call, dann müssen Sie den Parameter bei jedem Anruf vom Client manuell setzen. Der Ansatz, den ich Ihnen gegeben habe, ist, wie man eine Verbindung selbst einschränkt oder erlaubt. Wenn Sie jedoch die Verbindung zulassen und dann Anrufe auf bestimmte Methoden beschränken möchten, können Sie diesen Ansatz ebenfalls verwenden. Sie können die erforderlichen Daten für die Abfragezeichenfolge festlegen und dann innerhalb von AuthorizeHubMethodInvocation auf den ursprünglichen Verbindungskontext verweisen.

Wenn Sie dies jedoch zur Authentifizierung/Autorisierung verwenden, kann ich Ihnen nicht sagen, ob Ihr Schema sicher ist oder nicht. Das hängt davon ab, wie Sie alles andere eingerichtet haben. Ich kann Ihnen nur sagen, dass Sie so benutzerdefinierte Authentifizierung durchführen können.

Was ich eigentlich in meinem eigenen Code mache, ist Benutzerdaten in der HttpContext.Current.Items Sammlung der Verbindungsanforderung zu speichern (weil ich IIS System.Web verwende) und dann auf die AuthorizeHubMethodInvocation zugreifen, weil die Die HttpContext.Current.Items-Auflistung ist weiterhin für die Dauer der Verbindung verfügbar.