【问题标题】:User session management in asp.netasp.net中的用户会话管理
【发布时间】:2009-03-30 23:01:56
【问题描述】:

我的客户已经完成了我为他们构建的系统的安全审核。

他们希望它以这样一种方式工作:如果用户通过 Internet Explorer 登录,当他们通过 Firefox 在同一台机器上(或通过 IE 在另一台机器上)登录时,它会终止第一个会话。

本质上,这意味着将会话信息存储在我想象的数据库中,然后针对它设置一个活动/非活动标志,以便用户 ID、会话 ID、状态(如果用户 ID 具有活动会话),然后终止第一个会话,并创建新会话。

是否有任何内置机制可以使用 .NET 框架执行此操作,或者任何人都可以为我指明一些教程等的方向。

非常感谢,

埃德

【问题讨论】:

  • 你能澄清一下吗?如果用户从另一台机器/浏览器登录,那么他们在其他浏览器中的会话将停止并在新浏览器中继续?
  • 是的,正确 - 用户从另一台机器/浏览器登录,他们在其他浏览器中的会话停止并在新浏览器中继续
  • @Ian:我同意“规范”过于宽松,如果使用另一个 IE 实例怎么办? IOW 我们是说普遍只有一个浏览器进程可能有一个用户的活动会话?
  • @Ed,请编辑您的问题以加强要求。
  • @Anthony - 如果使用另一个 IE 实例,那么我会认为这是同一个会话 - 那是如果服务器很难区分同一浏览器容器中的会话(即多个 IE窗户)。

标签: asp.net session


【解决方案1】:

首先,在您的用户表中添加一个字段来存储当前使用的会话 ID。可以从您的代码轻松访问此 ID。当用户登录时,存储该 ID。

在每个页面请求上,检查以验证当前会话 ID 是否与您的用户表中存储的内容相匹配。如果不匹配,则清除当前会话数据并将用户踢回登录屏幕。

这不会阻止用户在 IE 7 中使用多个选项卡,因为 IE7 对每个选项卡使用相同的实例;但它会阻止他们使用多个浏览器实例。

这会起作用的原因是每个浏览器都包含它自己的 cookie 空间。会话根据存储会话 ID 的 cookie 值匹配服务器端,并在每次请求时发送回服务器。

顺便说一句,这不是消除会话劫持的非常有效的方法;这听起来像是安全审计试图阻止的。如果您需要这样做,请更新您的问题,我会更进一步。

更新

阻止会话劫持的一种方法是在会话中存储一个随机数并作为浏览器上的 cookie。当下一个请求进来时,验证 cookie 和会话值是否匹配。如果他们不这样做,则重置用户表中的会话 id 变量。这将强制所有会话重新登录。为每个页面请求(发布/获取)创建一个新的随机值。缺点是页面不能加书签;但这可能是可以接受的。

【讨论】:

  • 感谢您的建议 - 这可能有效,但我希望“新”会话覆盖“旧”会话,这样用户就不会被踢出。但是如果他们回到原来的浏览器/电脑并刷新或尝试访问某些东西,他们将被扔回登录
  • 这正是它的作用。每次他们登录时,只需使用最新的会话 ID 更新用户表。当旧的执行获取或发布时,它会发现它不是最新的,然后您重定向到登录屏幕。
  • Ed,这基本上就是我所做的。最后获胜,否则您必须等待他们的会话超时才能让他们重新登录。
  • @Chris:将“阻止他们使用多个浏览器窗口”更改为“多个浏览器实例”,从当前浏览器实例启动的多个窗口将使用同一个会话。
  • @Chris - 是的,这种“最后获胜”的方法似乎是要走的路。还有什么建议可以阻止会话劫持? @Anthony - 啊,是的,旧的“浏览器实例”与“浏览器窗口”栗子 - 让许多 Web 开发人员感到困惑。
【解决方案2】:

blogged 关于我如何处理这个问题。基本上我们的想法是我们创建一个具有 Guid 的非持久性 cookie。

然后我们将它与用户 ID 绑定在服务器上的某个位置(应用缓存、数据库等)。然后我们有一个轮询器,它每隔几分钟访问一次服务器,如果 cookie 与值不匹配,我们将用户注销。

【讨论】:

  • @Josh - 不错的方法 - 当然让我深思
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 1970-01-01
  • 2011-05-18
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 2021-11-29
相关资源
最近更新 更多