SignalR zapewnia ConnectionId dla każdego połączenia. Aby dowiedzieć się, które połączenie należy do kogo (użytkownika), musimy utworzyć mapowanie między połączeniem a użytkownikiem. Zależy to od tego, jak identyfikujesz użytkownika w swojej aplikacji.
W SignalR 2,0 odbywa się to przy użyciu wbudowanego IPrincipal.Identity.Name
, czyli identyfikatora zalogowanego użytkownika ustawionego podczas uwierzytelniania ASP.NET.
Jednak może być konieczne zmapowanie połączenia z użytkownikiem przy użyciu innego identyfikatora zamiast używania Identity.Name. W tym celu ten nowy dostawca może być używany z niestandardową implementacją do mapowania użytkownika z połączeniem.
Przykład mapowania użytkowników sygnalizujących na połączenia przy użyciu IUserIdProvider
Załóżmy, że nasza aplikacja używa znaku userId
do identyfikacji każdego użytkownika. Teraz musimy wysłać wiadomość do konkretnego użytkownika. Mamy userId
i message
, ale SignalR musi również znać mapowanie między naszym userId a połączeniem.
Aby to osiągnąć, najpierw musimy stworzyć nową klasę, która implementuje 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();
}
}
Drugim krokiem jest poinformowanie sygnalizującego, aby używał naszej CustomUserIdProvider
zamiast domyślnej implementacji. Można to zrobić w pliku Startup.cs podczas inicjowania konfiguracji koncentratora:
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();
}
}
Teraz możesz wysłać wiadomość do określonego użytkownika, używając jego, userId
jak wspomniano w dokumentacji, na przykład:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Mam nadzieję że to pomoże.