SignalR fournit un ConnectionId pour chaque connexion. Pour trouver à qui appartient chaque connexion (l'utilisateur), nous devons créer une correspondance entre la connexion et l'utilisateur. Cela dépend de la façon dont vous identifiez un utilisateur dans votre application.
Dans SignalR 2.0, cela se fait en utilisant IPrincipal.Identity.Name
intégré, qui est l'identifiant de l'utilisateur connecté tel que défini lors de l'authentification ASP.NET.
Cependant, vous pouvez avoir besoin de mapper la connexion avec l'utilisateur en utilisant un identifiant différent au lieu d'utiliser Identity.Name. À cette fin, ce nouveau fournisseur peut être utilisé avec votre implémentation personnalisée pour mapper l'utilisateur avec la connexion.
Exemple de mappage des utilisateurs SignalR aux connexions en utilisant IUserIdProvider
Supposons que notre application utilise un userId
pour identifier chaque utilisateur. Maintenant, nous devons envoyer un message à un utilisateur spécifique. Nous avons userId
et message
, mais SignalR doit également connaître la correspondance entre notre userId et la connexion.
Pour ce faire, nous devons d'abord créer une nouvelle classe qui implémente IUserIdProvider
:
public class CustomUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// votre logique pour récupérer un identifiant d'utilisateur va ici.
// par exemple :
var userId = MyCustomUserClass.FindUserId(request.User.Identity.Name);
return userId.ToString();
}
}
La deuxième étape consiste à indiquer à SignalR d'utiliser notre CustomUserIdProvider
au lieu de l'implémentation par défaut. Cela peut être fait dans le fichier Startup.cs lors de l'initialisation de la configuration du hub :
public class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new CustomUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
// Toute connexion ou configuration de hub doit être faite ici
app.MapSignalR();
}
}
Maintenant, vous pouvez envoyer un message à un utilisateur spécifique en utilisant son userId
comme mentionné dans la documentation, comme :
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}