SignalR でユーザーとグループを管理する

作成者: Brennan Conroy

SignalR を使用すると、特定のユーザーに関連付けられているすべての接続と、名前付きの接続グループにメッセージを送信できます。

サンプル コードを表示またはダウンロードする (ダウンロード方法)

SignalR 内のユーザー

SignalR の 1 人のユーザーがアプリに対して複数の接続を持つことができます。 たとえば、ユーザーは自分のデスクトップや電話で接続することができます。 各デバイスには個別の SignalR 接続がありますが、これらはすべて同じユーザーに関連付けられています。 ユーザーにメッセージが送信されると、そのユーザーに関連付けられているすべての接続によってメッセージが受信されます。 接続のユーザー識別子には、ハブ内の Context.UserIdentifier プロパティからアクセスできます。

既定では、SignalR は、接続に関連付けられている ClaimsPrincipal からの ClaimTypes.NameIdentifier をユーザー識別子として使用します。 この動作をカスタマイズするには、「要求を使用して ID 処理をカスタマイズする」をご覧ください。

次の例に示すように、ハブ メソッド内でユーザー識別子を User 関数に渡すことによって、特定のユーザーにメッセージを送信します。

Note

ユーザー識別子では、大文字と小文字が区別されます。

public Task SendPrivateMessage(string user, string message)
{
    return Clients.User(user).SendAsync("ReceiveMessage", message);
}

SignalR 内のグループ

グループとは、名前に関連付けられている接続のコレクションです。 メッセージは、グループ内のすべての接続に送信できます。 グループはアプリケーションによって管理されるため、接続または複数の接続に送信する方法としてグループをお勧めします。 1 つの接続が複数のグループのメンバーになることができます。 グループは、各ルームをグループとして表すことができるチャット アプリケーションのようなものに最適です。 接続は、AddToGroupAsync および RemoveFromGroupAsync メソッドを使用してグループに追加または削除されます。

public async Task AddToGroup(string groupName)
{
    await Groups.AddToGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has joined the group {groupName}.");
}

public async Task RemoveFromGroup(string groupName)
{
    await Groups.RemoveFromGroupAsync(Context.ConnectionId, groupName);

    await Clients.Group(groupName).SendAsync("Send", $"{Context.ConnectionId} has left the group {groupName}.");
}

接続を再接続した場合、グループのメンバーシップは保持されません。 接続が再確立された場合は、グループにもう一度参加する必要があります。 グループのメンバーをカウントすることはできません。アプリケーションが複数のサーバーにスケーリングされている場合は、この情報を利用できないためです。

グループの使用中にリソースへのアクセスを保護するには、ASP.NET Core 内の認証と承認の機能を使用します。 ユーザーがグループに追加されるのが、そのグループに対する資格情報が有効な場合のみの場合、そのグループに送信されたメッセージは承認されたユーザーのみに送られます。 ただし、グループはセキュリティ機能ではありません。 認証要求には、有効期限や失効など、グループにはない機能があります。 グループにアクセスするためのユーザーのアクセス許可が取り消された場合、アプリではユーザーをグループから明示的に削除する必要があります。

Note

グループ名では大文字と小文字が区別されます。

その他の技術情報