Administración de usuarios y grupos en SignalR
Por Surás Conroy
SignalR permite enviar mensajes a todas las conexiones asociadas a un usuario específico, así como a grupos con nombre de conexiones.
Vea o descargue el código de ejemplo (cómo descargarlo)
Usuarios en SignalR
Un solo usuario de 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 SignalR independiente, pero todos están asociados al mismo usuario. Si se envía un mensaje al usuario, todas las conexiones asociadas a ese usuario reciben el mensaje. La propiedad del centro puede acceder al identificador de Context.UserIdentifier usuario de una conexión.
De forma predeterminada, SignalR usa del asociado a la conexión como identificador de ClaimTypes.NameIdentifier ClaimsPrincipal 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 en un método de concentrador, como User 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);
}
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 algo como una aplicación de chat, donde cada sala se puede representar como un grupo. Las conexiones se agregan a los grupos o se quitan de ellos mediante los AddToGroupAsync RemoveFromGroupAsync métodos y .
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}.");
}
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.
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 tienen, 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 mayúsculas de minúsculas.