ASP.NET Core SignalR (六):在SignalR中管理用户和分组

此为系列文章,对MSDN ASP.NET Core SignalR 的官方文档进行系统学习与翻译。其中或许会添加本人对 ASP.NET Core 的浅显理解。

       SignalR 允许消息被发送给关联给特定用户的所有连接,以及命名的连接分组。

SignalR中的用户

       SignalR 允许你将消息发送给关联给特定用户的所有连接。默认情况下,SignalR使用与连接关联的来自于ClaimsPrincipal 的ClaimTypes.NameIdentifier作为用户标识。对于一个SignalR app 来说,一个单独的用户可以具有多个连接。比如,一个用户可以在其桌面上被连接,也可以在他的iPhone上连接。每一个设备都有一个独立的连接。但是它们都关联到一个相同的用户。如果消息被发送给这个用户,那么所有关联到这个用户的连接都会收到这个消息。可以通过你的 Hub 类的Context.UserIdentifier 属性来获取到这个连接的用户标识。

       通过将用户标识传递给你的 Hub 类中的 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 的  authentication and authorization 功能。当用户凭证对于分组是有效的时,如果你仅添加用户到分组中,那么发送给这个分组的消息仅仅会发送到授权用户。然而,分组并不是一个安全的特性。验证声明具有分组所不具有的特性,比如过期,撤销。如果一个用户对分组的访问许可被撤销了,你需要手动2的检测到它,并将其从分组中移除。

      注意,分组名称是大小写敏感的。

相关资源

原文地址:https://www.cnblogs.com/qianxingmu/p/12533215.html