SignalRは、接続ごとにConnectionIdを提供します。どの接続が誰(ユーザー)に属するかを見つけるには、接続とユーザー間のマッピングを作成する必要があります。これは、アプリケーションでユーザーを識別する方法によって異なります。
SignalR 2.0では、これはIPrincipal.Identity.Name
ASP.NET認証中に設定されたログインユーザー識別子であるinbuiltを使用して行われます。
ただし、Identity.Nameを使用する代わりに、別の識別子を使用してユーザーとの接続をマップする必要がある場合があります。この目的のために、この新しいプロバイダーをカスタム接続で使用して、接続を持つユーザーをマッピングできます。
IUserIdProviderを使用してSignalRユーザーを接続にマッピングする例
アプリケーションがを使用しuserId
て各ユーザーを識別すると仮定しましょう。次に、特定のユーザーにメッセージを送信する必要があります。とがuserId
ありますmessage
が、SignalRはuserIdと接続の間のマッピングも知っている必要があります。
これを実現するには、最初に以下を実装する新しいクラスを作成する必要があります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();
}
}
2番目のステップは、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);
}
}
お役に立てれば。