Gebruikers en groepen beheren in SignalR
Door Brennan Conroy
SignalR kunnen berichten worden verzonden naar alle verbindingen die zijn gekoppeld aan een specifieke gebruiker en naar benoemde groepen verbindingen.
Voorbeeldcode weergeven of downloaden(hoe te downloaden)
Gebruikers in SignalR
Eén gebruiker in SignalR kan meerdere verbindingen met een app hebben. Een gebruiker kan bijvoorbeeld zijn verbonden op het bureaublad en op zijn telefoon. Elk apparaat heeft een afzonderlijke SignalR verbinding, maar ze zijn allemaal gekoppeld aan dezelfde gebruiker. Als er een bericht naar de gebruiker wordt verzonden, ontvangen alle verbindingen die aan die gebruiker zijn gekoppeld het bericht. De gebruikers-id voor een verbinding kan verkregen worden via de eigenschap Context.UserIdentifier
in de hub.
Standaard gebruikt SignalR de ClaimTypes.NameIdentifier
uit de ClaimsPrincipal
die gekoppeld is aan de verbinding als de gebruikers-id. Zie Claims gebruiken om identiteitsafhandelingaan te passen om dit gedrag aan te passen.
Verzend een bericht naar een specifieke gebruiker door de gebruikers-id door te geven aan de functie User
in een hubmethode, zoals wordt weergegeven in het volgende voorbeeld:
Notitie
De gebruikers-id is hoofdlettergevoelig.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
Groepen in SignalR
Een groep is een verzameling verbindingen die zijn gekoppeld aan een naam. Berichten kunnen naar alle verbindingen in een groep worden verzonden. Groepen zijn de aanbevolen manier om te verzenden naar een verbinding of meerdere verbindingen omdat de groepen worden beheerd door de toepassing. Een verbinding kan lid zijn van meerdere groepen. Groepen zijn ideaal voor een chattoepassing, waarbij elke ruimte kan worden weergegeven als een groep.
Verbindingen toevoegen aan of verwijderen uit een groep
Verbindingen worden via de methoden AddToGroupAsync
en RemoveFromGroupAsync
toegevoegd aan of verwijderd uit groepen:
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}.");
}
Het is veilig om meerdere keren een gebruiker aan een groep toe te voegen. Er wordt geen uitzondering gegenereerd in het geval dat de gebruiker al in de groep bestaat.
Groepslidmaatschap blijft niet behouden wanneer een verbinding opnieuw verbinding maakt. De verbinding moet opnieuw deelnemen aan de groep wanneer deze opnieuw tot stand is gebracht. Het is niet mogelijk om de leden van een groep te tellen, omdat deze informatie niet beschikbaar is als de toepassing naar meerdere servers wordt geschaald.
Groepen worden in het geheugen bewaard, zodat ze niet behouden blijven tijdens het opnieuw opstarten van de server. Overweeg de Azure SignalR-service voor scenario's waarvoor groepslidmaatschap moet worden bewaard. Zie Azure SignalR voor meer informatie
Als u de toegang tot resources tijdens het gebruik van groepen wilt beveiligen, gebruikt u verificatie- en autorisatiefunctionaliteit functionaliteit in ASP.NET Core. Als een gebruiker alleen aan een groep wordt toegevoegd wanneer de referenties geldig zijn voor die groep, worden berichten die naar die groep worden verzonden, alleen naar geautoriseerde gebruikers verzonden. Groepen zijn echter geen beveiligingsfunctie. Verificatieclaims hebben functies die groepen niet hebben, zoals vervaldatum en intrekking. Als de machtiging van een gebruiker voor toegang tot de groep wordt ingetrokken, moet de app de gebruiker expliciet uit de groep verwijderen.
Notitie
Groepsnamen zijn hoofdlettergevoelig.