Gerenciar usuários e grupos em SignalR
Por Brennan Conroy
SignalR permite que as mensagens sejam enviadas para todas as conexões associadas a um usuário específico, bem como a grupos nomeados de conexões.
Exibir ou baixar código de exemplo (como baixar)
Usuários no SignalR
Um único usuário no SignalR pode ter várias conexões com um aplicativo. Por exemplo, um usuário pode estar conectado na área de trabalho, bem como no telefone. Cada dispositivo tem uma conexão SignalR separada, mas todos estão associados ao mesmo usuário. Se uma mensagem for enviada ao usuário, todas as conexões associadas a esse usuário receberão a mensagem. O identificador de usuário para uma conexão pode ser acessado pela propriedade Context.UserIdentifier
no hub.
Por padrão, SignalR usa o ClaimTypes.NameIdentifier
do ClaimsPrincipal
associado à conexão como o identificador de usuário. Para personalizar esse comportamento, consulte Usar declarações para personalizar o tratamento de identity.
Envie uma mensagem para um usuário específico passando o identificador de usuário para a função User
em um método de hub, conforme mostrado no exemplo a seguir:
Observação
O identificador do usuário diferencia maiúsculas de minúsculas.
public Task SendPrivateMessage(string user, string message)
{
return Clients.User(user).SendAsync("ReceiveMessage", message);
}
Grupos no SignalR
Um grupo é uma coleção de conexões associadas a um nome. As mensagens podem ser enviadas para todas as conexões em um grupo. Os grupos são a maneira recomendada de enviar para uma conexão ou várias conexões porque os grupos são gerenciados pelo aplicativo. Uma conexão pode ser membro de vários grupos. Os grupos são ideais para algo como um aplicativo de chat, em que cada sala pode ser representada como um grupo.
Adicionar ou remover conexões de um grupo
As conexões são adicionadas ou removidas dos grupos por meio dos métodos AddToGroupAsync
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}.");
}
É seguro adicionar um usuário a um grupo várias vezes, nenhuma exceção é gerada caso o usuário já exista no grupo.
A associação de grupo não é preservada quando uma conexão se reconecta. A conexão precisa reingressar no grupo quando for restabelecida. Não é possível contar os membros de um grupo, pois essas informações não estão disponíveis se o aplicativo é dimensionado para vários servidores.
Os grupos são mantidos na memória, portanto, eles não persistirão por meio de uma reinicialização do servidor. Considere o serviço do Azure SignalR para cenários que exigem a persistência da associação a um grupo. Para mais informações, confira Azure SignalR
Para proteger o acesso aos recursos ao usar grupos, use a funcionalidade de autenticação e autorização no ASP.NET Core. Se um usuário for adicionado a um grupo somente quando as credenciais forem válidas para esse grupo, as mensagens enviadas a esse grupo só irão para usuários autorizados. No entanto, os grupos não são um recurso de segurança. As declarações de autenticação têm recursos que os grupos não têm, como expiração e revogação. Se a permissão de um usuário para acessar o grupo for revogada, o aplicativo deverá remover o usuário do grupo explicitamente.
Observação
Os nomes dos grupos diferenciam maiúsculas de minúsculas.