【问题标题】:Handling user sessions and active statuses处理用户会话和活动状态
【发布时间】:2013-01-28 06:10:19
【问题描述】:

通常我会在成功登录后通过设置会话来处理登录用户。然后在每个请求上检查该会话以确保它存在。

但是如果我禁用了一个用户帐户并且他们当前已登录,那是什么意思?在这种情况下,用户仍然可以访问系统,直到他们的会话过期。

目前,我会根据每个请求从数据库中提取帐户信息并检查状态字段。我觉得这是很多不必要的开销。在我的场景中,这些帐户中有帐户和用户。因此,我必须检查每个请求的帐户状态以及用户状态。

有没有更好的方法?请注意,我将 SQL Server 会话状态用作多服务器环境。

提前致谢。

【问题讨论】:

    标签: c# asp.net session authentication


    【解决方案1】:

    在会话开始时将会话 ID 存储在数据库中。当您禁用用户时,只需删除数据库中用户会话 id 字段中的值即可。

    检查会话 ID 是否与请求时数据库中存储的会话 ID 匹配。

    如果没有,session.abandon()。

    【讨论】:

      【解决方案2】:

      当您禁用用户帐户时,为什么不删除与该帐户关联的任何会话。然后我们用户访问服务器,会话将不再存在,用户将无权访问。

      【讨论】:

      • 当我查看会话表时,我看到的唯一有用信息是 SessionId 列。我如何知道哪个会话 id 去往哪个用户?我是否需要检索创建的会话 ID(如果需要,如何?)并将其保存到“CurrentSessionID”字段中的数据库中?还是有更简单的方法将会话记录与用户关联?
      【解决方案3】:

      您可以使用cookies! Cookie 是最强大的轻量级数据 贮存 !存储加密的用户名信息和状态(活动/非活动) 进入cookies。

      【讨论】:

        【解决方案4】:

        代替存储每个请求的数据,在第一个请求之后,您可以实现类似AuthenticationManager.IsAuthorized("user name") 的方法。这个方法应该返回两个值:

        • 真/假(分别是否经过授权)。
        • 作为枚举的原因:UserBlocked、Timeout、...

        因此,您将在每次请求时检查会话是否仍然有效,并且每次会话开始都会检索一次用户数据。

        【讨论】:

          【解决方案5】:

          如果在您的应用程序中启用,您可以使用匿名标识:

          <anonymousIdentification enabled="true"/>
          

          你可以得到它:

          string strId = Request.AnonymousID;
          

          默认是 Guid。

          AnonymousId 对于每个用户都是唯一的,您将跟踪您的用户是否通过了身份验证。

          【讨论】:

            猜你喜欢
            • 2022-01-23
            • 1970-01-01
            • 2018-11-26
            • 1970-01-01
            • 2016-11-12
            • 1970-01-01
            • 2011-03-22
            • 1970-01-01
            • 2015-01-19
            相关资源
            最近更新 更多