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.
Affichez ou téléchargez 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 la section Utiliser des revendications pour personnaliser la gestion des identity..
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.