SignalR fornisce ConnectionId per ogni connessione. Per trovare quale connessione appartiene a chi (l'utente), dobbiamo creare una mappatura tra la connessione e l'utente. Dipende da come identifichi un utente nella tua applicazione.
In SignalR 2.0, questo viene fatto utilizzando l'inbuilt IPrincipal.Identity.Name
, che è l'identificatore dell'utente connesso come impostato durante l'autenticazione ASP.NET.
Tuttavia, potrebbe essere necessario mappare la connessione con l'utente utilizzando un identificatore diverso invece di utilizzare Identity.Name. A tale scopo, questo nuovo provider può essere utilizzato con l'implementazione personalizzata per mappare l'utente con la connessione.
Esempio di mappatura degli utenti SignalR alle connessioni tramite IUserIdProvider
Supponiamo che la nostra applicazione utilizzi un userId
per identificare ogni utente. Ora dobbiamo inviare un messaggio a un utente specifico. Abbiamo userId
e message
, ma SignalR deve anche conoscere la mappatura tra il nostro ID utente e la connessione.
Per ottenere ciò, prima dobbiamo creare una nuova classe che implementa 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();
}
}
Il secondo passo è dire a SignalR di usare il nostro CustomUserIdProvider
invece dell'implementazione predefinita. Questa operazione può essere eseguita in Startup.cs durante l'inizializzazione della configurazione dell'hub:
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();
}
}
Ora puoi inviare un messaggio a un utente specifico usando il suo userId
come menzionato nella documentazione, come:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Spero che questo ti aiuti.