SignalR proporciona ConnectionId para cada conexión. Para encontrar qué conexión pertenece a quién (el usuario), necesitamos crear un mapeo entre la conexión y el usuario. Esto depende de cómo identifique a un usuario en su aplicación.
En SignalR 2.0, esto se hace mediante el uso incorporado IPrincipal.Identity.Name
, que es el identificador de usuario que inició sesión según lo establecido durante la autenticación ASP.NET.
Sin embargo, es posible que deba asignar la conexión con el usuario utilizando un identificador diferente en lugar de utilizar Identity.Name. Para este propósito, este nuevo proveedor se puede utilizar con su implementación personalizada para mapear al usuario con la conexión.
Ejemplo de asignación de usuarios de SignalR a conexiones mediante IUserIdProvider
Supongamos que nuestra aplicación utiliza un userId
para identificar a cada usuario. Ahora, necesitamos enviar un mensaje a un usuario específico. Tenemos userId
y message
, pero SignalR también debe conocer el mapeo entre nuestro userId y la conexión.
Para lograr esto, primero necesitamos crear una nueva clase que implemente 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();
}
}
El segundo paso es decirle a SignalR que use nuestra CustomUserIdProvider
implementación en lugar de la predeterminada. Esto se puede hacer en Startup.cs mientras se inicializa la configuración del concentrador:
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();
}
}
Ahora, puede enviar un mensaje a un usuario específico usando su userId
como se menciona en la documentación, como:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Espero que esto ayude.