asp.net核心信号R身份

问题描述 投票:1回答:1

我有一个uwp客户端应用程序需要执行以下3个聊天功能方案。

  1. 和连接到信号R hub的所有人聊天(公共)
  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所以我无法将他们的userIds与我的数据库中的那个匹配,这正是我无法向特定用户发送私人消息的原因,因为上下文必须有用户信息目前还没有,根据文档,有一些复杂的令牌持有人的东西正在进行,我不知道api弹出微软登录用户(这将是理想的)。

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

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

我可以看到如何在Web应用程序中进行身份识别但无法找到在uwp等本机应用程序中执行相同操作的教程:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.2&tabs=visual-studio

c# uwp identity signalr-hub asp.net-core-signalr
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.