SignalR stellt für jede Verbindung die Verbindungs-ID bereit. Um herauszufinden, welche Verbindung zu wem (dem Benutzer) gehört, müssen wir eine Zuordnung zwischen der Verbindung und dem Benutzer erstellen. Dies hängt davon ab, wie Sie einen Benutzer in Ihrer Anwendung identifizieren.
In SignalR 2.0 erfolgt dies mithilfe der eingebauten IPrincipal.Identity.Name
Benutzerkennung, die während der ASP.NET-Authentifizierung festgelegt wurde.
Möglicherweise müssen Sie jedoch die Verbindung mit dem Benutzer mithilfe eines anderen Bezeichners zuordnen, anstatt den Identity.Name zu verwenden. Zu diesem Zweck kann dieser neue Anbieter mit Ihrer benutzerdefinierten Implementierung zum Zuordnen von Benutzern zur Verbindung verwendet werden.
Beispiel für die Zuordnung von SignalR-Benutzern zu Verbindungen mithilfe von IUserIdProvider
Nehmen wir an, unsere Anwendung verwendet a userId
, um jeden Benutzer zu identifizieren. Jetzt müssen wir eine Nachricht an einen bestimmten Benutzer senden. Wir haben userId
und message
, aber SignalR muss auch die Zuordnung zwischen unserer Benutzer-ID und der Verbindung kennen.
Um dies zu erreichen, müssen wir zuerst eine neue Klasse erstellen, die Folgendes implementiert 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();
}
}
Der zweite Schritt besteht darin, SignalR anzuweisen, unsere CustomUserIdProvider
anstelle der Standardimplementierung zu verwenden. Dies kann in der Datei Startup.cs erfolgen, während die Hub-Konfiguration initialisiert wird:
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();
}
}
Jetzt können Sie eine Nachricht an einen bestimmten Benutzer senden, indem Sie dessen userId
wie in der Dokumentation beschrieben verwenden, z.
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Hoffe das hilft.