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

提供 : Brennan Conroy

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

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

のユーザー SignalR

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

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

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

注意

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

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

のグループ SignalR

グループは、名前に関連付けられた接続のコレクションです。 メッセージは、グループ内のすべての接続に送信できます。 グループはアプリケーションによって管理されるので、接続または複数の接続に送信するための推奨される方法です。 接続には、複数のグループのメンバーを指定できます。 グループは、各部屋をグループとして表すことができるチャットアプリケーションのようなものに最適です。 接続は、メソッドとメソッドを使用してグループに追加されるか、グループから削除され 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 で 認証と承認 の機能を使用します。 そのグループに対して資格情報が有効な場合にのみ、ユーザーがグループに追加されると、そのグループに送信されたメッセージは、承認されたユーザーのみに送られます。 ただし、グループはセキュリティ機能ではありません。 認証要求には、有効期限や失効など、グループにはない機能があります。 グループにアクセスするためのユーザーのアクセス許可が取り消された場合、アプリはユーザーをグループから明示的に削除する必要があります。

注意

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