繁体   English   中英

asp.net核心signalR身份

[英]asp.net core signalR identity

我有一个 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,所以我无法将他们的用户 ID 与我的数据库中的用户 ID 匹配,这正是我无法向特定用户发送私人消息的原因,因为上下文必须具有用户信息目前还没有,根据文档,有一些复杂的令牌持有者正在发生,我不知道为用户弹出 Microsoft 登录的 api(这将是理想的)。

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

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

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

您需要使用自定义用户名存储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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM