Управление пользователями и группами в SignalR

Бреннан Конрой

SignalR позволяет отправлять сообщения всем подключениям, связанным с определенным пользователем, и именованным группам подключений.

Просмотрите или скачайте пример кода (описание процедуры скачивания)

Пользователи в SignalR

Один пользователь может SignalR иметь несколько подключений к приложению. Например, пользователь может быть подключен к рабочему столу, а также к телефону. Каждое устройство имеет отдельное SignalR подключение, но все они связаны с тем же пользователем. Если пользователю отправляется сообщение, все подключения, связанные с этим пользователем, получают сообщение. Идентификатор пользователя для подключения может получить доступ к Context.UserIdentifier свойству в концентраторе.

По умолчанию SignalR в качестве идентификатора пользователя используется ClaimTypes.NameIdentifier из ClaimsPrincipal связанного с подключением. Сведения о настройке этого поведения см. в разделе "Использование утверждений для настройки обработки удостоверений".

Отправьте сообщение конкретному пользователю, передав идентификатор 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}.");
}

Это безопасно, чтобы добавить пользователя в группу несколько раз, в случае, если пользователь уже существует в группе, исключение не возникает.

Членство в группах не сохраняется при повторном подключении подключения. Подключение должно повторно присоединиться к группе при повторной установке. Невозможно подсчитать членов группы, так как эта информация недоступна, если приложение масштабируется до нескольких серверов.

Группы хранятся в памяти, поэтому они не будут сохраняться с помощью перезапуска сервера. Рассмотрим службу Azure SignalR для сценариев, требующих сохранения членства в группах. Дополнительные сведения см. в статье Azure SignalR

Чтобы защитить доступ к ресурсам при использовании групп, используйте функции проверки подлинности и авторизации в ASP.NET Core. Если пользователь добавляется в группу только в том случае, если учетные данные допустимы для этой группы, сообщения, отправленные этой группе, будут отправляться только авторизованным пользователям. Однако группы не являются функцией безопасности. Утверждения проверки подлинности имеют функции, которые не поддерживают группы, такие как срок действия и отзыв. Если разрешение пользователя на доступ к группе отменяется, приложение должно явно удалить пользователя из группы.

Примечание.

Имена групп чувствительны к регистру.

Дополнительные ресурсы