Gérer les utilisateurs et les groupes dans SignalR

Par Brennan Conroy

SignalR permet d’envoyer des messages à toutes les connexions associées à un utilisateur spécifique et à des groupes de connexions nommés.

Afficher ou télécharger l’exemple de code(procédure de téléchargement)

Utilisateurs dans SignalR

Un seul utilisateur dans SignalR peut avoir plusieurs connexions à une application. Par exemple, un utilisateur peut être connecté sur son bureau ainsi que sur son téléphone. Chaque appareil dispose d’une connexion SignalR distincte , mais ils sont tous associés au même utilisateur. Si un message est envoyé à l’utilisateur, toutes les connexions associées à cet utilisateur le reçoivent. L’identificateur utilisateur d’une connexion est accessible par la propriété Context.UserIdentifier dans le hub.

Par défaut, SignalR utilise le ClaimTypes.NameIdentifier du ClaimsPrincipal associé à la connexion comme l’identificateur d'utilisateur. Pour personnaliser ce comportement, consultez Utiliser des revendications pour personnaliser la gestion des identités.

Envoyez un message à un utilisateur spécifique en passant l’identificateur d’utilisateur à la fonction User dans une méthode hub, comme illustré dans l’exemple suivant :

Remarque

L’identificateur utilisateur respecte la casse.

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

Les groupes dansSignalR

Un groupe est une collection de connexions associées à un nom. Les messages peuvent être envoyés à toutes les connexions d’un groupe. Les groupes sont le moyen recommandé d’envoyer à une connexion ou à plusieurs connexions, car les groupes sont gérés par l’application. Une connexion peut être membre de plusieurs groupes. Les groupes sont idéaux pour quelque chose comme une application de conversation, où chaque salle peut être représentée en tant que groupe.

Ajoutez ou supprimez des connexions depuis un groupe

Les connexions sont ajoutées ou supprimées de groupes via les méthodes AddToGroupAsync et 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}.");
}

Il est sécuritaire d’ajouter un(e) utilisateur(-trice) à un groupe plusieurs fois, aucune exception n’est levée dans le cas où l’utilisateur(-trice) existe déjà dans le groupe.

L’appartenance au groupe n’est pas conservée lorsqu’une connexion se reconnecte. La connexion doit rejoindre le groupe lorsqu’elle est rétablie. Il n’est pas possible de compter les membres d’un groupe, car ces informations ne sont pas disponibles si l’application est mise à l’échelle sur plusieurs serveurs.

Les groupes sont conservés en mémoire, de sorte qu’ils ne sont pas conservés par le biais d’un redémarrage du serveur. Considérez le service Azure SignalR pour les scénarios nécessitant que l’appartenance au groupe soit conservée. Pour plus d’informations, consultez Azure SignalR

Pour protéger l’accès aux ressources lors de l’utilisation de groupes, utilisez la fonctionnalité d’authentification et d’autorisation dans ASP.NET Core. Si un utilisateur est ajouté à un groupe uniquement lorsque les informations d’identification sont valides pour ce groupe, les messages envoyés à ce groupe sont envoyés uniquement aux utilisateurs autorisés. Toutefois, les groupes ne sont pas une fonctionnalité de sécurité. Les revendications d’authentification ont des fonctionnalités que les groupes n’ont pas, telles que l’expiration et la révocation. Si l’autorisation d’accès au groupe d’un utilisateur est révoquée, l’application doit le supprimer du groupe explicitement.

Remarque

Les noms de groupes respectent la casse.

Ressources supplémentaires