如何使用 Windows 身份验证向 ASP.NET Core (MVC) 中的特定用户发送 SignalR 通知?

How to send SignalR notifications to specific user in ASP.NET Core (MVC) with Windows Authentication?

我正在开发 ASP.NET 核心 MVC 网络应用程序。该应用程序使用 Windows 身份验证。一旦收到 post 请求,我想从 API 控制器向客户端发送通知。我发现这个资源 https://docs.microsoft.com/en-us/aspnet/core/signalr/authn-and-authz?view=aspnetcore-5.0) 说我需要使用 CustomUserIdProvider 来获取特定用户的 ID。但是,我不确定应该如何调用以下方法:

_myHub.Clients.User(specificUserId).SendAsync("ReceiveMessage", message);

如何在我的 API 控制器中获取特定的用户 ID。我尝试注入 CustomUserIdProvider 然后调用此方法:

_myHub.Clients.User(_customUserIdProvider.GetUserId(conn)).SendAsync("ReceiveMessage", message);

但是我不知道如何从这个 API 控制器获取 GetUserId 方法所需的 HubConnectionContext conn 对象。

这是 CustomUserIdProvider class:

public class CustomUserIdProvider : IUserIdProvider
{
    public string GetUserId(HubConnectionContext connection)
    {
        return connection.User?.Identity?.Name;
    }
}

如果这不起作用,是否有任何其他方法可以将 SignalR 通知发送给通过 Windows 身份验证向 ASP.NET MVC Web 应用程序进行身份验证的特定用户?谢谢!

您不应该将 CustomUserIdProvider 的实例传递给中心。 IUserIdProvider 定义了 SignalR returns userId 如何识别用户的幕后发生的事情。

您注册了您的 CustomUserIdProvider

services.AddSingleton<IUserIdProvider, CustomUserIdProvider>();

这样做的目的是将您提供的用户 ID 与它在其用户列表中查找的用户 ID 相匹配。

然后,如果您尝试在控制器而不是集线器中执行此操作,我认为您可以这样做:

public Controller(IHttpContextAccessor httpContextAccessor)
{
   _userId = httpContextAccessor.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
}

如本回答所示:

然后

_myHub.Clients.User(_userId).SendAsync("ReceiveMessage", message);

您不需要实际连接。如果您使用 post 请求发送用户名,只需获取该用户名并将其传递到此处

_myHub.Clients.User(Username).SendAsync("ReceiveMessage", message);

或者如果它包含在消息对象中

_myHub.Clients.User(message.Username).SendAsync("ReceiveMessage", message);

更新

如果您在 CustomUserIdProvider 中使用 connection.User?.Identity?.Name 获得的字符串格式是 [Domain][Username],那么您应该可以通过 Post 请求传递它,然后在 User() 方法中使用它。