【问题标题】:Disabling ASP.NET Session refresh for specific request禁用特定请求的 ASP.NET 会话刷新
【发布时间】:2011-09-16 09:55:15
【问题描述】:

我们的网站有 20 分钟的会话超时,而我们的用户希望收到 10 分钟的会话到期警告。目前我们正在使用一个可以完成这项工作的控件,但它不支持 AJAX,因此即使用户一直在做一些事情也会弹出。

我有一个想法来解决这个问题,只需每 2 分钟轮询一次服务器,以了解用户在会话中的剩余时间。但经过研究,我无法确定是否可以说“此请求不应刷新超时”,这至关重要,因为轮询行为会无意中刷新会话超时。

这可能吗,还是我走错了路?

【问题讨论】:

    标签: c# .net asp.net ajax session


    【解决方案1】:

    我认为您可以做到这一点的唯一可靠方法是修改您的 ajax javascript 以延长现有脚本的超时时间。

    您可以对页面使用禁用会话状态,然后修改您的应用程序以将用户的最后访问时间存储在数据库中。轮询无会话页面以了解用户上次执行某项操作的时间。

    无论哪种方式,您都必须在您的应用中进行大量更改。

    【讨论】:

    • 我们对 Ajax Pro 进行了修改,以便在服务器的每个响应上调用 reset 方法。似乎运作良好。感谢您的意见 - 对延迟的行动表示歉意。
    【解决方案2】:

    如果您的会话有 20 分钟的固定到期时间,那么刷新页面不会延长它。然而,如果你想在你的页面上有一个脚本来提醒用户他们即将到期的会话,那么你需要设置一个客户端脚本(假设是 Javascript)并在页面加载时启动它?

    <script type="text/javascript">
    function alertSessionTimeout(){ alert("Your session is about to expire. Please refresh the page.") }
    window.setTimeout('alertSessionTimeout', 10*60*1000);
    </script>
    

    【讨论】:

    • 我认为这就是 OP 所说的他已经在做的事情。如果页面到达服务器,刷新页面将延长会话。对服务器的每个请求都会扩展会话。
    【解决方案3】:

    如果两个 Web 应用程序访问同一个数据库呢?在第一个,主应用程序中,您写入最后一次访问数据库的时间,第二个应用程序通过 ajax 轮询以获取基于上次访问时间的非活动时间...

    【讨论】:

    • 我喜欢你的想法 :) - 我会和我的同事讨论,看看这对我们来说是否可行。
    【解决方案4】:

    在轮询服务器时,您会看到还剩多长时间,您会将其重置为 20 分钟。您需要确保请求不附加会话 cookie 以防止这种情况发生。这样做会产生另一个问题,即您无法访问用户会话。

    另一种方法是在 JavaScript 页面加载中使用 SetTimeout。

    【讨论】:

      【解决方案5】:

      似乎有些人将会话状态与表单身份验证票到期混淆了。会话状态具有自动滑动到期 - 如果会话设置为 20 分钟,并且在与办公室的朋友交谈 19 分钟后,您请求一个页面,您将获得另外 20 分钟。

      【讨论】:

        【解决方案6】:

        这是一个老问题,但我有一个类似的问题,并且有这个解决方案的想法。

        在使用会话的每个页面请求时,您的会话都会刷新。进入应用程序缓存,输入 key=sessionId 和 value=DateTime.Now。

        创建一个不使用会话状态的 Web 服务(.ashx 或你有什么),但理想情况下使用表单身份验证或其他一些身份验证方案进行身份验证。您的 javascript 正在倒计时直到会话到期,它将在会话到期前不久调用此 Web 服务,以查看会话是否真的会到期。

        我认为 Web 服务应该返回一些简单的东西,例如如果会话已过期,则返回 2,如果会话即将过期,则返回 1,否则返回 0。如果服务由具有未知或无效 SessionId cookie 的用户调用,则返回随机 [0,1,2] - 这有望阻止获得 Forms Auth cookie 的攻击者发现有效的 sessionId。

        我调查了反编译内置 SessionProvider 以查看是否可以访问会话以发现过期而不触发刷新。但是这样做取决于所使用的会话提供程序的类型,所以如果你曾经从 SQL Server 会话提供程序迁移到 Redis,你必须重写它。

        【讨论】:

          猜你喜欢
          • 2015-09-09
          • 1970-01-01
          • 2022-01-14
          • 2019-02-13
          • 1970-01-01
          • 2016-04-17
          • 2010-11-30
          • 2012-01-26
          • 1970-01-01
          相关资源
          最近更新 更多