SignalR은 각 연결에 대한 ConnectionId를 제공합니다. 어떤 연결이 누구 (사용자)에게 속하는지 확인하려면 연결과 사용자 간의 매핑을 만들어야합니다. 이는 애플리케이션에서 사용자를 식별하는 방법에 따라 다릅니다.
SignalR 2.0에서는 IPrincipal.Identity.Name
ASP.NET 인증 중에 설정된 로그인 사용자 식별자 인 inbuilt를 사용하여 수행됩니다 .
그러나 Identity.Name을 사용하는 대신 다른 식별자를 사용하여 사용자와의 연결을 매핑해야 할 수 있습니다. 이를 위해이 새 공급자를 사용자 지정 구현과 함께 사용하여 사용자를 연결에 매핑 할 수 있습니다.
IUserIdProvider를 사용하여 SignalR 사용자를 연결에 매핑하는 예
응용 프로그램에서 a userId
를 사용하여 각 사용자를 식별 한다고 가정 해 보겠습니다 . 이제 특정 사용자에게 메시지를 보내야합니다. 우리가 userId
하고 message
있지만, SignalR는 또한 우리의 사용자 ID와 연결 간의 매핑을 알고 있어야합니다.
이를 위해 먼저 다음을 구현하는 새 클래스를 만들어야합니다 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();
}
}
두 번째 단계는 SignalR에 CustomUserIdProvider
기본 구현 대신 우리를 사용하도록 지시하는 것입니다. 허브 구성을 초기화하는 동안 Startup.cs에서 수행 할 수 있습니다.
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();
}
}
이제 다음 userId
과 같이 문서에 언급 된대로 특정 사용자에게 메시지를 보낼 수 있습니다 .
public class MyHub : Hub
{
public void Send(string userId, string message)
{
Clients.User(userId).send(message);
}
}
도움이 되었기를 바랍니다.