Verwalten von Benutzern und Gruppen in SignalR
Von Brennan Conroy
SignalR ermöglicht das Senden von Nachrichten an alle Verbindungen, die einem bzw. einer bestimmten Benutzer*in zugeordnet sind, sowie an benannte Gruppen von Verbindungen.
Anzeigen oder Herunterladen von Beispielcode (Vorgehensweise zum Herunterladen)
Benutzer in SignalR
Ein einzelner Benutzer in SignalR kann mehrere Verbindungen mit einer App haben. Beispielsweise kann ein Benutzer sowohl auf dem Desktop als auch auf dem Smartphone verbunden sein. Jedes Gerät verfügt über eine separate SignalR-Verbindung, aber alle sind demselben Benutzer zugeordnet. Wenn eine Nachricht an den Benutzer gesendet wird, erhalten alle Verbindungen die Nachricht, die diesem Benutzer zugeordnet sind. Auf die Benutzer-ID für eine Verbindung kann über die Context.UserIdentifier
-Eigenschaft im Hub zugegriffen werden.
SignalR verwendet standardmäßig den ClaimTypes.NameIdentifier
von ClaimsPrincipal
, der der Verbindung zugeordnet ist, als Benutzer-ID. Informationen zum Anpassen dieses Verhaltens finden Sie unter Verwenden von Ansprüchen zum Anpassen der identity-Behandlung.
Sie senden eine Nachricht an einen bestimmten Benutzer, indem Sie die Benutzer-ID an die User
-Funktion in einer Hubmethode übergeben, wie im folgenden Beispiel gezeigt:
Hinweis
Bei der Benutzer-ID wird Groß-/Kleinschreibung beachtet.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
Gruppen in SignalR
Eine Gruppe ist eine Sammlung von Verbindungen, die einem Namen zugeordnet sind. Nachrichten können an alle Verbindungen in einer Gruppe gesendet werden. Gruppen sind die empfohlene Methode zum Senden an eine oder mehrere Verbindungen, da die Gruppen von der Anwendung verwaltet werden. Eine Verbindung kann Mitglied mehrerer Gruppen sein. Gruppen eignen sich ideal für eine Chatanwendung, bei der jeder Raum als Gruppe dargestellt werden kann.
Hinzufügen oder Entfernen von Verbindungen aus einer Gruppe
Verbindungen werden Gruppen über die Methoden AddToGroupAsync
und RemoveFromGroupAsync
hinzugefügt oder daraus entfernt:
public async Task AddToGroup(string groupName)
{
await Groups.AddToGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}
public async Task RemoveFromGroup(string groupName)
{
await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);
await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}
Es ist sicher, eine*n Benutzer*in mehrmals zu einer Gruppe hinzuzufügen; es wird keine Ausnahme ausgelöst, wenn der bzw. die Benutzer*in bereits in der Gruppe vorhanden ist.
Die Gruppenmitgliedschaft wird nicht beibehalten, wenn eine Verbindung wiederhergestellt wird. Die Verbindung muss der Gruppe erneut beitreten, nachdem sie wiederhergestellt wurde. Es ist nicht möglich, die Anzahl der Mitglieder einer Gruppe zu zählen, da diese Information nicht verfügbar ist, wenn die Anwendung auf mehrere Server skaliert wird.
Gruppen werden im Arbeitsspeicher gespeichert, sodass sie auch nicht nach einem Neustart des Servers beibehalten werden. Erwägen Sie den SignalR-Dienst von Azure für Szenarien, in denen die Gruppenmitgliedschaft beibehalten werden muss. Weitere Informationen finden Sie unter AzureSignalR
Um bei Verwendung von Gruppen den Zugriff auf Ressourcen zu schützen, nutzen Sie die Funktionalität zur Authentifizierung und Autorisierung in ASP.NET Core. Falls ein Benutzer nur dann einer Gruppe hinzugefügt wird, wenn die Anmeldeinformationen für diese Gruppe gültig sind, werden Nachrichten, die an diese Gruppe gesendet werden, nur an autorisierte Benutzer weitergeleitet. Gruppen sind jedoch kein Sicherheitsfeature. Authentifizierungsansprüche verfügen über Features, die Gruppen nicht haben, z. B. Ablauf und Widerruf. Wenn die Berechtigung eines Benutzers für den Zugriff auf die Gruppe widerrufen wird, muss die App den Benutzer explizit aus der Gruppe entfernen.
Hinweis
Bei Gruppennamen wird Groß- und Kleinschreibung beachtet.