Skip to main content
 首页 » 编程设计

c#之SignalR 自定义连接 ID

2024年08月12日25tintown

我们知道可以使用自定义 IUserIdProvider 设置新连接的 ID。

public string GetUserId(IRequest request) 
{ 
    var context = request.GetHttpContext(); 
    ... 
} 

此方法必须返回新的连接 ID。 我的 Web 应用程序架构很简单:

当使用连接时,应用程序生成可以从 javascript 变量访问的 guid(字符串)。然后在内部使用生成的 guid。所以问题是我如何将附加变量传递给 signalR 请求以在 GetUserId 方法中使用它。 谢谢!

请您参考如下方法:

首先,让我们澄清一些术语。当您设置 custom IUserIdProvider您实际上并没有更改客户端的连接 ID,而是更改了客户端的用户 ID。

客户端的连接 ID 始终是 SignalR 在每个连接启动时随机生成的 GUID。这是无法更改的。要从给定连接 ID 的集线器向客户端发送消息,您可以编写:Clients.Client(connectionId).myMethod(...)

默认情况下,客户端的用户 ID 是用户的 IPrincipal.Identity.Name,但这可以根据自定义 IUserIdProvider 进行更改。与连接 ID 不同,用户 ID 可以由多个连接共享。可能发生这种情况的常见情况是,当单个用户在多个浏览器选项卡中打开使用 SignalR 的应用程序时。要从给定用户 ID 的集线器向用户发送消息,您可以编写:Clients.User(userId).myMethod(...)

要回答您的问题,您可以set a query string parameter这将与您可以在 GetUserId 方法中读取的每个 SignalR 请求一起发送。请注意,攻击者可以轻松地将自己的查询字符串设置为他们想要的任何内容。如果您不小心设计应用,这可能会导致冒充用户。