Administrar usuarios y grupos en SignalR

Por Brennan Conroy

SignalR permite enviar mensajes a todas las conexiones asociadas a un usuario específico y a grupos con nombre de conexiones.

Vea o descargue el código de ejemplo(cómo descargarlo):

Usuarios en SignalR

Un solo usuario en SignalR puede tener varias conexiones a una aplicación. Por ejemplo, un usuario podría estar conectado en su escritorio, así como en su teléfono. Cada dispositivo tiene una conexión independiente SignalR, pero todas están asociadas al mismo usuario. Si se envía un mensaje al usuario, todas las conexiones asociadas a ese usuario reciben el mensaje. La propiedad en el centro Context.UserIdentifier puede acceder al identificador de usuario para una conexión.

De manera predeterminada, SignalR usa el ClaimTypes.NameIdentifier del ClaimsPrincipal asociado a la conexión como identificador de usuario. Para personalizar este comportamiento, consulte Uso de notificaciones para personalizar el control de identidades.

Envíe un mensaje a un usuario específico pasando el identificador de usuario a la función User en un método concentrador, como se muestra en el ejemplo siguiente:

Nota:

El identificador de usuario distingue mayúsculas de minúsculas.

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

Los grupos en SignalR

Un grupo es una colección de conexiones asociadas a un nombre. Los mensajes se pueden enviar a todas las conexiones de un grupo. Los grupos son la manera recomendada de enviar a una conexión o a varias conexiones porque la aplicación administra los grupos. Una conexión puede ser miembro de varios grupos. Los grupos son ideales para una aplicación de chat, donde cada sala se puede representar como un grupo.

Adición o eliminación de conexiones de un grupo

Las conexiones se agregan o quitan de grupos a través de los AddToGroupAsync métodos y 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}.");
}

Es seguro agregar un usuario a un grupo varias veces, no se produce ninguna excepción en caso de que el usuario ya exista en el grupo.

La pertenencia a grupos no se conserva cuando se vuelve a conectar una conexión. La conexión debe volver a unirse al grupo cuando se vuelva a establecer. No es posible contar los miembros de un grupo, ya que esta información no está disponible si la aplicación se escala a varios servidores.

Los grupos se mantienen en memoria, por lo que no se conservarán a través de un reinicio del servidor. Considere el servicio Azure SignalR para escenarios que requieren que se conserve la pertenencia a grupos. Para más información, consulte Azure SignalR

Para proteger el acceso a los recursos mientras se usan grupos, use la funcionalidad de autenticación y autorización en ASP.NET Core. Si un usuario se agrega a un grupo solo cuando las credenciales son válidas para ese grupo, los mensajes enviados a ese grupo solo irán a los usuarios autorizados. Sin embargo, los grupos no son una característica de seguridad. Las notificaciones de autenticación tienen características que los grupos no, como la expiración y la revocación. Si se revoca el permiso de un usuario para acceder al grupo, la aplicación debe quitar el usuario del grupo explícitamente.

Nota:

Los nombres de grupo distinguen entre mayúsculas y minúsculas.

Recursos adicionales