表单验证超时 vs 会话状态超时

163

我正在查看关于网站会话超时的代码。在web.config文件中,我找到了这段代码。

 <authentication mode="Forms">
  <forms loginUrl="~/Auth/SignOn.aspx" timeout="40" slidingExpiration="true" />
</authentication>

<sessionState timeout="30" />

有人知道它们之间是否有优先顺序以及它们的区别吗?谢谢。


2
可能是Forms Authentication Timeout vs Session Timeout的重复问题。 - Huseyin Yagli
7个回答

264

它们是不同的东西。Forms Authentication Timeout值设置身份验证cookie有效的时间,即在value分钟后,cookie将过期,用户将不再被认证,会自动重定向到登录页面。 slidingExpiration=true的值基本上表示只要用户在超时值内发出请求,他们将继续被认证(更多细节here)。如果设置slidingExpiration=false,则无论用户是否在超时值内发出请求,身份验证cookie都将在value分钟后过期。

SessionState超时值设置了Session State提供程序必须在内存中(或使用的任何后备存储,如SQL Server、OutOfProc等)保存特定会话数据的时间(以分钟为单位)。例如,如果您使用示例中的值将对象放入Session中,则此数据将在30分钟后被删除。用户可能仍然经过身份验证,但Session中的数据可能不再存在。建议每次请求后重置这里这里Session Timeout值(可能需要cookie;与无cookie相对比)。


35
澄清一下:表单身份验证超时设置了[Ticket] (http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.aspx) 的过期时间,而不一定是存储Ticket的cookie的过期时间。Cookie可能根本没有过期时间(令人困惑地称为会话cookie,这意味着该cookie将持续到用户关闭浏览器),或者可能根本没有cookie(使用"cookieless"表单身份验证)。对于持久cookie,表单身份验证会将cookie的过期时间和Ticket的过期时间设置为相同。 - bmode
20
MSDN提供了进一步的解释:“为了防止性能损失,并避免多个浏览器警告出现(针对已经开启cookie警告的用户),当超过指定时间的一半时,才会更新cookie。”因此,只有在cookie的一半时间到期时才会重置它的超时时间。因此建议将cookie超时时间设置为会话超时时间的2倍。 - user917170

26

19
据我所知,身份验证超时时间和会话超时时间是独立的。通过将会话超时时间设置为小于或等于身份验证超时时间,您可以确保在身份验证超时后不会持久保存任何用户特定的会话变量(如果这是您关心的问题,那么这是正常情况下提出这个问题的原因)。当然,在注销时,您需要手动处理会话变量的处理。
这里有一个不错的回答,可能会回答您的问题或至少指引您正确的方向:

7

区别在于一个(表单超时)与用户身份验证有关,另一个(会话超时)与服务器上缓存数据的存储时间有关。因此,它们是非常独立的事物,所以一个不会优先于另一个。


5
      <sessionState timeout="2" />
      <authentication mode="Forms">
          <forms name="userLogin" path="/" timeout="60" loginUrl="Login.aspx" slidingExpiration="true"/>
      </authentication>

这个配置每两分钟就会把我重定向到登录页面,这似乎与之前的答案相违背。


5
如果登录相关信息存储在会话变量中,并且当该变量清除时,重定向到登录页面是可能发生的。所以这取决于代码? - Steve

0

0

两者之间的区别在于一个(表单超时)与验证用户有关,而另一个(会话超时)与服务器上缓存数据的存储时间有关。因此,它们是非常独立的事物,因此一个不会优先于另一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接