我们正在开发一项功能,允许用户一次只能在一台设备上使用我们的产品,而该功能的先决条件之一是能够远程注销给定用户,而无需在其设备上进行任何交互结束。
为了实现这一目标,我使用 SignalR。我面临的问题是,当我触发注销命令时,接收器端没有任何反应。如果使用
Client.All
,它将按预期工作(但会注销所有用户,包括发送命令的用户)。有趣的是,当看起来它应该注销除发送命令的用户之外的所有其他用户时,Client.Others
不会注销任何人。然而,主要问题是 Clients.User(userId)
不起作用。
AuthHub 很简单,由一个触发注销逻辑的方法组成:
public Task LogOut(string userId)
{
return Clients.User(userId).SendAsync("logOut");
}
该方法触发命令:
private async Task ForceLogout()
{
try
{
if (HubConnection is not null)
{
await HubConnection.SendAsync("LogOut", User.Id);
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
并在这里收到:
protected override async Task OnInitializedAsync()
{
hubConnection = new HubConnectionBuilder()
.WithUrl(mNavigationManager.ToAbsoluteUri("/authhub"))
.WithAutomaticReconnect()
.Build();
hubConnection.On("logOut", async () =>
{
// Log out logic...
});
await hubConnection.StartAsync();
}
根据 Microsoft 关于在 SignalR 中管理用户的文档,“默认情况下,SignalR 使用与连接关联的 ClaimsPrincipal 中的
ClaimTypes.NameIdentifier
作为用户标识符。”在这种情况下,我的理解是这应该有效,因为 NameIdentifier 声明类型包含 UserId,这就是我传递给集线器方法调用的内容。
使用调试器,我可以看到目标用户声明的 NameIdentifier 部分是正确的 UserId,所以我想知道我在这里缺少什么。
你需要改变方法。
2.使用参考ID和用户ID,您可以保存详细信息并将详细信息发送到您的signalrhub,并可以基于此实现注销 根据最新要求
3.在最近请求的窗口中显示弹出窗口以确认在其他设备中注销
4.点击设备后,您可以注销其他设备。