我们知道可以使用自定义IUserIdProvider
设置新连接的ID。
public string GetUserId(IRequest request)
{
var context = request.GetHttpContext();
...
}
此方法必须返回新的连接ID。 我的Web应用程序架构很简单:
当使用连接时,应用程序生成guid(字符串)可以从javascript变量中获取。然后在内部使用生成的guid。所以问题是如何将其他变量传递给signalR请求以在GetUserId
方法中使用它。
谢谢!
答案 0 :(得分:1)
首先,让我们清楚一些术语。当您设置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发送每个SignalR请求,您可以在GetUserId
方法中阅读这些请求。请注意,攻击者可以轻松地将自己的查询字符串设置为他们想要的任何内容。如果您不小心如何设计应用,则可以冒充用户。