asp.net核心signalR身份

时间:2019-02-26 08:33:47

标签: c# uwp identity signalr-hub asp.net-core-signalr

我有一个uwp客户端应用程序,需要执行以下3种场景的聊天功能。

  1. 与连接到信号R集线器的所有人(公共)聊天
  2. 仅与MyGroup聊天:每个用户将成为一个组的一部分。
  3. 私人聊天(与其他用户进行1v1聊天)

我有以下集线器代码,我可以通过这些代码设法实现公共和群组功能。

public class ChatHub : Hub
{
    public Task SendPrivateTweet(string user, string message)
    {
        return Clients.User(user).SendAsync("ReceiveTweet", user, message);
    }

    public async Task SendTweet(string user, string message)
    {
        await Clients.All.SendAsync("ReceiveTweet", user, message);
    }


    public async Task SendTweetGroup(string groupName, string user, string message)
    {
        await Clients.Group(groupName).SendAsync("ReceiveTweet", user, message);
    }

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

        await Clients.Group(groupName).SendAsync("EnteredOrLeft", $"{user} has joined the group {groupName}.");
    }

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

        await Clients.Group(groupName).SendAsync("EnteredOrLeft", $"{user} has left the group {groupName}.");
    }
}

我有一个包含用户信息的数据库,每个用户都有一个链接到它的组名,基于此,我将每个连接添加到各自的组中。

await hubConnection.InvokeAsync("AddToGroup", user.Name, user.GroupName);

我必须这样做,因为我没有用户登录到signalR,所以我无法将其用户名与数据库中的用户名匹配,这正是为什么我无法向特定用户发送私人消息的原因,因为为此,上下文必须拥有目前尚不存在的用户信息,根据文档显示,正在发生一些复杂的令牌承载操作,并且我不知道该API会为用户弹出Microsoft登录信息(这是理想选择)。

还有其他方法可以将用户ID保留在集线器中,以便通过发送接收方用户ID轻松地从客户端发送私人消息吗?

我的意思是,可以在连接到集线器时从每个连接中分配一个用户ID吗?以后可以在集线器中用于查询吗?

我可以看到如何在Web应用程序中进行身份验证,但找不到在uwp这样的本机应用程序中进行身份验证的教程:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.2&tabs=visual-studio

1 个答案:

答案 0 :(得分:1)

您需要将ConnectionId与自定义用户名一起存储。发现为Context.ConnectionId。您必须处理连接和断开连接,因为ID将在会话之间改变。

这里有一个例子。不用担心Identity。您可以使用存储在数据库中的自定义ID。我想因为没有人登录,所以您不必担心别人装作别人。

https://docs.microsoft.com/en-us/aspnet/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

说实话,您的问题令人困惑。我假设您是在让用户每次连接时都在对话框中键入其名称,对吗?然后,只需存储ConnectionId。