【问题标题】:Session timeout is not working while using SqlServer mode使用 SqlServer 模式时会话超时不起作用
【发布时间】:2017-07-22 13:28:48
【问题描述】:

我正在开发 ASP.Net MVC 应用程序。

我们使用了 sessionState 模式 SQLServer,我将超时设置为 20 分钟。

<sessionState mode="SQLServer" 
              sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa" 
              cookieless="false" 
              timeout="2" />

Web 配置中的代码是这样的。

我也设置了登录页面。

<authentication mode="Forms">
  <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

现在,当会话到期时,我想将用户导航到登录页面。

我检查了很多东西,但我无法理解它究竟是如何工作的?以及如何在会话过期时导航用户登录页面?

它在 InProc 模式下工作。我以同样的方式使用它,并且用户在会话过期时被重定向到登录。

但我无法在 SQLServer 模式下完成同样的事情。

我无法理解我错过了什么?

我查了Session State,还发现Session timeout handled in SQLServer Mode

编辑:- 每当为该会话执行另一个 http 请求时,我想将用户重定向到登录页面。

【问题讨论】:

  • 会话采用 滑动 超时。每次您再次访问您的网站时,会话超时都会重置。
  • @ChrisPratt 好的。我应该如何处理这种情况?是不是因为SQLServer模式?
  • 这就是我要说的。你不能。当用户处于活动状态时,会话永远不会超时,无论是 20 分钟还是 2 小时。如果用户空闲,并且会话超时,则下一个请求将简单地启动一个新会话。您最可能想要做的只是将身份验证设置为在 20 分钟后过期。这必然会强制用户在 20 分钟后重新登录,因为这滑动。

标签: asp.net sql-server asp.net-mvc session


【解决方案1】:

InProc 和 SQLServer 模式的区别在于 SQLServer 依赖 MSSQL 作业来删除会话。它不会阻止您再次登录。

Session State Providers

SqlSessionStateStore 不会主动监控 Expires 字段。相反,它依赖外部代理来清理数据库并删除过期会话——过期字段包含的日期和时间小于当前日期和时间的会话。 ASPState 数据库包含一个 SQL Server 代理作业,该作业定期(默认情况下,每 60 秒)调用存储过程 DeleteExpiredSessions 以删除过期会话。

【讨论】:

    【解决方案2】:

    对我来说,将 web.config 文件中的超时值更改为任何内容都没有发生,原因是 ASPState 数据库中的 ASPStateTempSessions 表中有一些剩余的旧记录。我不得不清空表格,然后我的 web.config 更改才发生。我浪费了一个小时试图寻找原因,所以希望这对某人有所帮助。

    所以,运行这个:

    从 ASPStateTempSessions 中删除

    【讨论】:

      【解决方案3】:

      通常浏览器不知道服务器上发生了什么。除非发生 HTTP 往返,否则它会记住页面呈现时的会话状态。

      另外,你的会话 cookie 可能是 HttpOnly,所以页面没有办法检查会话 cookie 的存在。

      实现您想要的一种方法是:

      1. 将隐藏的 iFrame 添加到您的页面。将 iFrame 的 SRC 设置为您网站中的处理程序

      2. 除了返回 200 OK 外,处理程序不需要做太多事情,再加上设置为几秒钟的刷新标头,以便处理程序不断轮询。

        context.Response.AddHeader("REFRESH", "2");
        
      3. 在您的登录页面中添加分帧代码

         if (top.location != location) {
            top.location.href = document.location.href ;
         }
        
      4. 当对处理程序的请求发生在会话过期时,它将通过表单身份验证重定向到登录页面;返回登录页面时,它会破坏您的 iFrame 并将整个窗口重定向到登录页面。

      或者,你也可以像其他人一样,等待用户请求另一个页面。

      【讨论】:

      • 当页面发出另一个http请求时,甚至可以识别会话过期。当它在另一个 http 请求上识别会话过期时,我想将用户重定向到登录操作方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-05
      • 2016-01-21
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多