Delen via


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.

Aanvullende informatiebronnen