Gestire utenti e gruppi in SignalR

Di Brennan Conroy

SignalR consente l'invio di messaggi a tutte le connessioni associate a un utente specifico e a gruppi denominati di connessioni.

Visualizzare o scaricare il codice di esempio (come scaricare)

Utenti in SignalR

Un singolo utente in SignalR può avere più connessioni a un'app. Ad esempio, un utente potrebbe essere connesso sul desktop e sul telefono. Ogni dispositivo ha una connessione separata SignalR , ma sono tutti associati allo stesso utente. Se un messaggio viene inviato all'utente, tutte le connessioni associate a tale utente ricevono il messaggio. È possibile accedere all'identificatore utente per una connessione tramite la Context.UserIdentifier proprietà nell'hub.

Per impostazione predefinita, SignalR usa l'oggetto ClaimTypes.NameIdentifier dell'oggetto ClaimsPrincipal associato alla connessione come identificatore utente. Per personalizzare questo comportamento, vedere Usare le attestazioni per personalizzare la gestione delle identità.

Inviare un messaggio a un utente specifico passando l'identificatore utente alla User funzione in un metodo hub, come illustrato nell'esempio seguente:

Nota

L'identificatore utente fa distinzione tra maiuscole e minuscole.

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

Gruppi in SignalR

Un gruppo è una raccolta di connessioni associate a un nome. I messaggi possono essere inviati a tutte le connessioni in un gruppo. I gruppi sono il modo consigliato per inviare a una connessione o a più connessioni perché i gruppi sono gestiti dall'applicazione. Una connessione può essere membro di più gruppi. I gruppi sono ideali per un'applicazione di chat, in cui ogni sala può essere rappresentata come gruppo.

Aggiungere o rimuovere connessioni da un gruppo

Connessione vengono aggiunte o rimosse dai gruppi tramite i AddToGroupAsync metodi e RemoveFromGroupAsync :

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}.");
}

È sicuro aggiungere un utente a un gruppo più volte, non viene generata alcuna eccezione nel caso in cui l'utente esista già nel gruppo.

L'appartenenza al gruppo non viene mantenuta quando una connessione si riconnette. La connessione deve rientrare nel gruppo quando viene ristabilita. Non è possibile contare i membri di un gruppo, poiché queste informazioni non sono disponibili se l'applicazione viene ridimensionata in più server.

I gruppi vengono mantenuti in memoria, in modo che non vengano mantenuti tramite un riavvio del server. Prendere in considerazione il servizio di Azure SignalR per gli scenari che richiedono la persistenza dell'appartenenza ai gruppi. Per altre informazioni, vedere Azure SignalR

Per proteggere l'accesso alle risorse usando i gruppi, usare la funzionalità di autenticazione e autorizzazione in ASP.NET Core. Se un utente viene aggiunto a un gruppo solo quando le credenziali sono valide per tale gruppo, i messaggi inviati a tale gruppo verranno inviati solo agli utenti autorizzati. Tuttavia, i gruppi non sono una funzionalità di sicurezza. Le attestazioni di autenticazione hanno funzionalità che i gruppi non sono, ad esempio la scadenza e la revoca. Se l'autorizzazione di un utente per accedere al gruppo viene revocata, l'app deve rimuovere l'utente dal gruppo in modo esplicito.

Nota

I nomi dei gruppi fanno distinzione tra maiuscole e minuscole.

Risorse aggiuntive