SignalR fornece ConnectionId para cada conexão. Para descobrir qual conexão pertence a quem (o usuário), precisamos criar um mapeamento entre a conexão e o usuário. Isso depende de como você identifica um usuário em seu aplicativo.
No SignalR 2.0, isso é feito usando o embutido IPrincipal.Identity.Name
, que é o identificador do usuário conectado conforme definido durante a autenticação ASP.NET.
No entanto, pode ser necessário mapear a conexão com o usuário usando um identificador diferente em vez de usar o Identity.Name. Para este propósito, este novo provedor pode ser usado com sua implementação customizada para mapear o usuário com a conexão.
Exemplo de mapeamento de usuários SignalR para conexões usando IUserIdProvider
Vamos supor que nosso aplicativo use um userId
para identificar cada usuário. Agora, precisamos enviar uma mensagem para um usuário específico. Temos userId
e message
, mas o SignalR também deve saber o mapeamento entre nosso userId e a conexão.
Para conseguir isso, primeiro precisamos criar uma nova classe 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();
}
}
A segunda etapa é dizer ao SignalR para usar nosso em CustomUserIdProvider
vez da implementação padrão. Isso pode ser feito no Startup.cs ao inicializar a configuração do 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();
}
}
Agora, você pode enviar mensagem para um usuário específico usando o seu userId
conforme mencionado na documentação, como:
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
Espero que isto ajude.