asp.net 核心 signalR 标识
asp.net core signalR identity
我有一个 uwp 客户端应用程序,它需要为聊天功能执行以下 3 个场景。
- 与连接到信号 R 集线器 (public) 的每个人聊天
- 仅与 MyGroup 聊天:每个用户都是一个组的一部分。
- 私人聊天(与其他用户 1v1 聊天)
我有以下集线器代码,我以某种方式设法执行 public 和组功能。
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 相匹配,这正是我无法向特定用户发送私人消息的原因,因为为此context 必须有目前没有的用户信息,根据 docs 有一些复杂的 token bearer 东西在进行,我不知道 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
您需要使用自定义用户名存储 ConnectionId
。它被发现为 Context.ConnectionId
。您必须处理连接和断开连接,因为 id 会在会话之间发生变化。
这里有一个例子。不用担心 Identity
。您可以使用存储在数据库中的自定义 ID。我想既然没有人登录,你就不会担心有人假装成别人。
老实说,你的问题令人费解。我假设您让用户在每次连接时都在对话框中输入他们的名字,对吗?然后,只需存储 ConnectionId。
我有一个 uwp 客户端应用程序,它需要为聊天功能执行以下 3 个场景。
- 与连接到信号 R 集线器 (public) 的每个人聊天
- 仅与 MyGroup 聊天:每个用户都是一个组的一部分。
- 私人聊天(与其他用户 1v1 聊天)
我有以下集线器代码,我以某种方式设法执行 public 和组功能。
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 相匹配,这正是我无法向特定用户发送私人消息的原因,因为为此context 必须有目前没有的用户信息,根据 docs 有一些复杂的 token bearer 东西在进行,我不知道 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
您需要使用自定义用户名存储 ConnectionId
。它被发现为 Context.ConnectionId
。您必须处理连接和断开连接,因为 id 会在会话之间发生变化。
这里有一个例子。不用担心 Identity
。您可以使用存储在数据库中的自定义 ID。我想既然没有人登录,你就不会担心有人假装成别人。
老实说,你的问题令人费解。我假设您让用户在每次连接时都在对话框中输入他们的名字,对吗?然后,只需存储 ConnectionId。