SignalR自定义连接ID

时间:2014-12-05 09:30:41

标签: c# asp.net-mvc-4 signalr signalr-hub

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

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

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

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

1 个答案:

答案 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方法中阅读这些请求。请注意,攻击者可以轻松地将自己的查询字符串设置为他们想要的任何内容。如果您不小心如何设计应用,则可以冒充用户。