将UserId用作连接ID并将其存储为cookie是安全/可行的

时间:2012-08-08 17:27:34

标签: c# asp.net signalr

我已经看到许多示例,用于扩展signalR hub类的CreateConnectionId,例如:

http://www.kevgriffin.com/maintaining-signalr-connectionids-across-page-instances/

Storing User On Login then Pushing Data On Demand

但确实将每个用户的connection_id更改为他的UserId(请记住我正在使用开箱即用的标准asp成员资格提供程序)会造成安全威胁吗?我可以看到这样做会有多好,所以我不必保留用户到connection_id的内部映射,但是如果我将它存储在用户浏览器的cookie中,它也会有安全威胁。

2 个答案:

答案 0 :(得分:3)

不是安全,最终会破坏SignalR。

原因是如果你是使用用户的数据库ID并将其存储在cookie中,当您在浏览器中打开第二个选项卡时,将生成相同的连接ID(因为相同的cookie将被发送到服务器)。

这显然很糟糕,只要您打开两个标签页或浏览器窗口就会破坏SignalR,这在您引用的文章中没有提及。此外,正如Icarus所描述的,人们可以更改cookie并接收其他用户的消息。

更好的方法是: 保留默认的GUID连接ID生成器,然后将连接添加到在开始连接后由您自己的ID(例如,数据库ID或电子邮件地址)标识的组。通过这种方式,您可以调用Clients[emailAddress].doSomething()并将其广播到此用户的所有打开的标签页。

答案 1 :(得分:0)

我冒险回答并说“是”,这看起来不错,因为cookie可以轻松操作,用户可以将其更改为其他随机ID并开始接收不适合他的消息/数据。