SignalR fournit ConnectionId pour chaque connexion. Pour trouver quelle connexion appartient à qui (l'utilisateur), nous devons créer un mappage entre la connexion et l'utilisateur. Cela dépend de la manière dont vous identifiez un utilisateur dans votre application.
Dans SignalR 2.0, cela se fait à l'aide de la fonction intégrée IPrincipal.Identity.Name
, qui est l'identificateur de l'utilisateur connecté tel que défini lors de l'authentification ASP.NET.
Cependant, vous devrez peut-être mapper la connexion avec l'utilisateur à l'aide d'un identificateur 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 d'utilisateurs SignalR à des connexions à l'aide de 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 le mappage entre notre userId et la connexion.
Pour y parvenir, nous devons d'abord créer une nouvelle classe qui implémente IUserIdProvider
:
public class CustomUserIdProvider : IUserIdProvider
{
public string GetUserId(IRequest request)
{
// your logic to fetch a user identifier goes here.
// for example:
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 Startup.cs lors de l'initialisation de la configuration du concentrateur:
public class Startup
{
public void Configuration(IAppBuilder app)
{
var idProvider = new CustomUserIdProvider();
GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider), () => idProvider);
// Any connection or hub wire up and configuration should go here
app.MapSignalR();
}
}
Maintenant, vous pouvez envoyer un message à un utilisateur spécifique en utilisant le sien userId
comme mentionné dans la documentation, comme:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
J'espère que cela t'aides.