Blazor - 在 SignalR 中定位特定用户

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

我们正在开发一项功能,允许用户一次只能在一台设备上使用我们的产品,而该功能的先决条件之一是能够远程注销给定用户,而无需在其设备上进行任何交互结束。

为了实现这一目标,我使用 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,所以我想知道我在这里缺少什么。

asp.net blazor signalr asp.net-identity
1个回答
0
投票

你需要改变方法。

  1. 需要创建自定义引用来识别设备/任何自定义逻辑-referenceid

2.使用参考ID和用户ID,您可以保存详细信息并将详细信息发送到您的signalrhub,并可以基于此实现注销 根据最新要求

3.在最近请求的窗口中显示弹出窗口以确认在其他设备中注销

4.点击设备后,您可以注销其他设备。

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