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 fazer download do código de exemplo(como fazer download)

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 identidade.

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.

Recursos adicionais