【问题标题】:In ASP.Net, Can I find out if another session exists or is valid by a session Id?在 ASP.Net 中,我可以通过会话 ID 确定另一个会话是否存在或是否有效?
【发布时间】:2012-11-10 00:57:30
【问题描述】:

有没有办法从现有的请求上下文中找出会话 ID 是否有效?在那,如果我获得了一个会话 ID,并且我当前处于由 Http 请求发起的另一个会话中,并且我在一个页面或某个类中,我可以验证该会话 ID,如果它有效并且当前存在并且没有被抛弃?

这样做的原因是,我们需要在我正在处理的项目的页面上锁定用户登录过程,以便任何用户只能登录一次。我对此的想法是在用户表中添加一个会话 id 列,如果它为空,则他们已注销,并在他们登录时设置并在他们注销时或在 global.asax 中的 Session_End 上清除。但是,如果由于某种原因会话被放弃而没有清除,我需要能够再次登录,在这种情况下,只要他们登录并在该列中找到会话 ID,我认为它应该以某种方式检查该会话 ID 是否处于活动状态且有效,如果不是,它将重置为新的会话 ID 并允许他们登录。

谢谢

【问题讨论】:

  • 您需要永远保持他们的会话吗?这意味着 ASP .NET 最终将放弃过期的会话。但从用户的角度来看,应用程序状态是否应该始终保持不变?
  • 我们没有,我们有 30 分钟的滑动时间,需要用户重新登录。我们没有使用任何基于 cookie 的身份验证,只是活动会话并将用户对象存储在它。当会话超时时,他们会“注销”并必须重新登录。

标签: c# asp.net session login httprequest


【解决方案1】:

您需要将会话存储在数据库中以便之前查找。
HOW TO: Configure SQL Server to Store ASP.NET Session State中查看更多信息

【讨论】:

  • 上面的评论英文不好,但想法是对的。如果您将 SQL Server 用于会话状态,我相信它会将会话 ID 存储为一列。你可以检查一下。
【解决方案2】:

我能想到的唯一方法是按照 Neperz 所说的做,并使用 SQLServer 会话提供程序将您的会话存储在数据库中,这意味着您可以使用 SQL 查询来查看可用的内容。

但有一些注意事项需要考虑:

  1. 我认为存储在会话数据库表中的会话 ID 与您可以通过代码访问的会话 ID 完全相同。我不记得我是在哪里读到这篇文章的,但我想我在做类似的事情来监控所有活动会话时遇到了这个问题。
  2. 如果使用 SQLServer 会话提供程序,全局 Session_End 事件将永远不会触发。
  3. 除非您在代码中明确使用 Session.Abandon() 来完成会话(例如,当用户注销时),否则您的会话可能会一直存在,直到 SQL 代理作业清除任何过期的会话。这意味着,如果有人刚刚关闭了他们的浏览器窗口,那么他们的会话仍会显示为“活动”,这可能会使您的实施复杂化。

【讨论】:

    【解决方案3】:

    您拥有/拥有的另一个选项 :-) 是使用 Wea​​kReferences :

    • Dictionary<youruseridtype,WeakReference> 在应用程序级别存储为 Application["mySessionDictionnary"]
    • 在启动 Session 时,将用户 ID 和对 Session 对象本身的 WeakReference 存储在字典中
    • 当用户想要登录时,您可以在字典中检查他或她的 ID。如果 Session 对象有一个非空的 WeakReference,您可以 Abandon() 这个现有的 Session 对象,确保每个用户不超过一个活动会话。

    WeakReference 确保您不会遭受内存泄漏。

    注意:这仅适用于 inProc 会话管理。由于字典不会在应用程序重新启动后继续存在,因此对于会话应该是相同的。

    希望您已经找到问题的正确答案;-)

    【讨论】:

      【解决方案4】:

      没有直接验证 SessionId 的方法。选项:

      • 您可以实现自己的会话状态提供程序(或者 ID 管理器就足够了)来公开对该信息的访问权限 (http://msdn.microsoft.com/en-us/library/aa479024.aspx)。
      • 只需根据您认为当前用户应该拥有的 ID 设置会话 ID cookie 并重新呈现页面来尝试作弊。一秒钟的请求,您将能够查看该 ID 是否对应于有效状态并在需要时重新登录。

      注意:我不会为此目的使用会话 ID,因为您将依赖实施细节。也许简单地拒绝该用户看起来不是最新的会话会起作用。将“我当前的会话名称”属性保存在 Session["someName"] 和用户数据库中应该足以拒绝呈现较旧的会话。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-17
        • 2020-01-08
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        • 1970-01-01
        相关资源
        最近更新 更多