用户和组

管理 SignalR 中的用户和组

作者: Brennan Conroy

SignalR 允许将消息发送到与特定用户关联的所有连接以及命名连接组。

查看或下载示例代码 (如何下载)

SignalR 中的用户

SignalR 允许向与特定用户关联的所有连接发送消息。 默认情况下,SignalR 使用与连接关联的 ClaimsPrincipal 中的 ClaimTypes.NameIdentifier 作为用户标识符。 单个用户可以有多个到 SignalR 应用的连接。 例如,用户可以连接到其桌面以及他们的手机上。 每个设备都有一个单独的 SignalR 连接,但它们都与同一用户关联。 如果向用户发送一条消息,则所有与该用户关联的连接都将收到该消息。 可以通过中心中的 Context.UserIdentifier 属性访问连接的用户标识符。

向特定用户发送一条消息,方法是将用户标识符传递到中心方法中的 User 函数,如以下示例中所示:

备注

用户标识符区分大小写。

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

SignalR 中的组

组是与某个名称关联的连接的集合。 可以将消息发送到组中的所有连接。 建议将组发送到一个或多个连接,因为这些组由应用程序管理。 连接可以是多个组的成员。 这使得组非常适合作为聊天应用程序,其中每个会议室都可以表示为一个组。 可以通过 AddToGroupAsyncRemoveFromGroupAsync 方法将连接添加到组或从组中删除连接。

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 中使用身份验证和授权功能。 如果只在凭据对该组有效的情况下将用户添加到组中,则发送到该组的消息将只发送到已授权的用户。 但组不是一种安全功能。 身份验证声明具有组不具备的功能,如过期和吊销。 如果用户对组的访问权限被吊销,则必须手动检测并将其从组中删除。

备注

组名区分大小写。