2017-03-02 45 views
0

我正在开发ASP.Net MVC应用程序。使用SqlServer模式时会话超时不起作用

我们使用了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请求的是会话中执行到登录页面。

+0

会话使用*滑动*超时。每次您再次访问您的网站时,会话超时都会重置。 –

+0

@ChrisPratt好的。我应该如何处理这种情况?是因为SQLServer模式吗? –

+0

这就是我要说的。你不能。在用户处于活动状态时,会话永远不会超时,无论是20分钟还是2小时。如果用户空闲,并且会话超时,则下一个请求将简单地启动一个新会话。您最可能想要做的只是将身份验证设置为20分钟后过期。这将迫使用户在20分钟后重新登录,因为这是*不可*滑动。 –

回答

1

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

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

之一来完成你想要什么样的方式是:

  1. 添加隐藏iFrame到您的网页。设置iFrame的SRC的处理程序在你的网站

  2. 处理程序没有做太多,除了返回200 OK,加上刷新标题设置为几秒钟,从而使处理程序不断轮询。

    context.Response.AddHeader("REFRESH", "2"); 
    
  3. 添加framebreaker码到您的登录页面

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

或者,您可以执行其他人的操作,这是等待用户请求另一个页面。

+0

当页面发出另一个http请求时,甚至可以识别会话过期。当它识别另一个http请求上的会话过期时,我想将用户重定向到登录操作方法。 –