ASP.NET会话ID在浏览器选项卡之间共享

时间:2010-10-19 10:02:29

标签: asp.net session-state

我最近一直在使用在proc会话中使用的asp.net webforms开发一个网站,我注意到会话ID在浏览器标签之间共享。所以我想知道你会为以下情况做些什么:

问题: 在一个浏览器问题中具有不同用户的多个登录

  1. 用户打开浏览器标签1,登录 用“user1” - 存储在 会话
  2. 用户打开浏览器标签2,使用“user2”登录 - 存储在会话中
  3. 在此阶段,会话信息现在指向“user2”,因为会话ID在浏览器之间共享 翼片
  4. 用户在标签1上尝试操作,突然他们有“user2” 信息
  5. 如何在标签1中提醒用户用户已更改或如何强制tab1用户注销?

    我最初的想法是通过数据库或应用程序对象保存具有会话ID的活动用户列表,但我面临的问题是在标签1中我要比较列表,当我请求HttpContext时.Current.User将更新为“user2”我怎么知道浏览器标签1最初为“user1”

    感谢任何让我知道上述问题的替代方案或最佳做法的人

    问候DotnetShadow

6 个答案:

答案 0 :(得分:7)

为什么不在user2登录时发出警告?有一条消息,例如“您已经以user1身份登录,您确定要再次以其他用户身份登录吗?”

答案 1 :(得分:2)

有些人建议在网址中添加uniquifiers,并根据这些内容进行跟踪。

如果您打算这样做,您也可以让ASP.Net通过启用cookieless sessions为您执行此操作 - 然后使用该URL来包含会话ID。

答案 2 :(得分:1)

就是这样。你无能为力。用户现在已经习惯了这种行为,因为它在gmail等着名的互联网网站中是一致的......所以它对他们来说应该不是什么大问题。

答案 3 :(得分:1)

浏览器中的所有选项卡都属于同一个实例,因此所有选项卡共享Cookie和会话,您无法做很多事情。如果您想要实现这一点,我想到的唯一解决方案是为每个URL携带一个唯一的会话ID。根据该唯一ID,您可以链接特定用户。您需要自定义会话逻辑,并且必须确保您网站中的所有链接都带有此唯一ID。这可以通过很多努力来完成,但真正的问题是,它值得做吗?

答案 4 :(得分:1)

我要做的是避免此问题重定向附加一个简短的随机in-url登录标识符。

然后,我不是直接使用会话,而是在随机的in-url代码下的会话变量中存储一个强类型对象,并使用那个对象进行会话存储。如果你想保持简单,你可以使用词典。除了正常的会话超时之外,您还应该跟踪每个登录ID中的最后一次使用情况,并在会话过长时手动超时,以避免新用户保持旧登录活动。

基本上,每个ASP.NET会话对应于任意数量的登录会话。

这具有以下优点:

  • 可以同时以多个用户身份登录。这对于许多网站来说都很方便。
  • 在公共航站楼,它有助于避免意外的会话劫持。当用户离开公共终端时,关闭webapp选项卡但不关闭浏览器(这很常见),然后另一个人接近该终端并打开一个新窗口或选项卡到您的站点,这个新用户看不到以前记录的跟踪在用户中。当然,用户注销,任何人都可以查看历史记录,但没有理由邀请滥用。
  • CSRF针对您网站的攻击有点困难,因为没有随机登录ID的网址毫无意义。
  • 如果使用哈希表,实现非常简单 - 毕竟,任何sessionstate-consumer都已编写为存储并从哈希表中检索数据,您只需要更改它使用的哈希表,理想情况下应该包含自定义超时。

明显的缺点是你需要在网址中包含随机代码;而且你需要一些额外的实现。您可以使用基于iframe和/或javascript + XHR的站点隐藏额外的代码,但这样做会对站点进行更具侵略性的更改。最后,请注意,无Cookie会话不一样;虽然它们更容易打开,但它们涉及更长时间的人性友好的URL令牌,并且由于缺少正常的cookie会话令牌,与会话劫持相比也不太安全(因为突然发现任何其他程序甚至机器都发现了会话ID可以假装是该用户)。

答案 5 :(得分:0)

如何在viewstate中存储数据?这对每个窗口都是独一无二的。