C# 如何获取每个连接的用户?

C# 如何获取每个连接的用户?,c#,authentication,asp.net-core,signalr,asp.net-core-signalr,C#,Authentication,Asp.net Core,Signalr,Asp.net Core Signalr,我正在使用JWT令牌对用户进行身份验证。如果它工作正常,Context.User已正确填充。问题是它只有一个用户,集线器不是每个连接都有一个用户吗 在我要循环检查所有当前连接的OnNotification方法中,验证用户是否有权限查看我将要发送的内容,然后在他/她有权限时发送,否则发送 我怎样才能做到这一点 [Authorize] public class NotifyHub : Hub { private readonly MyApi _api; public Not

我正在使用JWT令牌对用户进行身份验证。如果它工作正常,
Context.User
已正确填充。问题是它只有一个用户,集线器不是每个连接都有一个用户吗

在我要循环检查所有当前连接的
OnNotification
方法中,验证用户是否有权限查看我将要发送的内容,然后在他/她有权限时发送,否则发送

我怎样才能做到这一点

  [Authorize]
  public class NotifyHub : Hub {
    private readonly MyApi _api;

    public NotifyHub(MyApi api) {
      _api = api;
      _api.Notification += OnNotification;
    }

    private async void OnNotification(object sender, Notification notification) {
      //  can access Context.User here
      await Clients.All.SendAsync("Notification", notification);
    }
  }

使用集线器时,可以调用调用方客户端(
Clients.caller
)、一个特定客户端(
Clients.User(“client\u id”)
)、一组客户端(
Clients.group(“group name”)
)和所有客户端(
Clients.all
)上的方法

如果这些都不符合您的需要,您应该实现自己的类来跟踪连接到
集线器的用户
(非常简单,因为集线器有
OnConnectedAsync
OnDisconnectedAsync
事件处理程序,我通常使用一个单例类、一个列表和一些锁来实现,只是为了线程安全)


请注意,集线器是暂时的。它们在从客户端收到请求之前不存在,并且在请求完成后立即被释放。因此,不建议订阅事件。集线器是
IDisposable
,因此框架将在请求完成后处理它们,因此在事件到达时,它们可能已经被释放。Y您应该将
IHubContext
(这是将中心的客户端存储在内存中的内容)注入到
MyApi
中,并将其与连接的用户存储类一起使用。

这是一个解决方法的示例。但是您将使用
Context.user
。我的中心作为singleton
服务添加。AddSingleton()
我真的认为这不是一个好主意,至少我没有看到有人这样做:D.例如,通过将中心设置为单体,您无法访问其中的任何作用域服务,并且我认为如果是单体,中心使用的资源也不会被释放。如果是单体,线程安全也可能是一个问题。但是如果我的hub每秒被创建100次以用于即将发布的工作进度更新,这不是一个性能问题吗?如果它对性能有很大影响,我不认为它是这样设计的。