表单身份验证超时与 sessionState 超时

Posted

技术标签:

【中文标题】表单身份验证超时与 sessionState 超时【英文标题】:Forms authentication timeout vs sessionState timeout 【发布时间】:2013-07-22 16:31:17 【问题描述】:

我正在查看有关网站会话超时的代码。在 web.config 我遇到了这段代码。

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

<sessionState timeout="30" />

有谁知道一个是否优先于另一个,以及它们有何不同。谢谢。

【问题讨论】:

Forms Authentication Timeout vs Session Timeout的可能重复 【参考方案1】:

它们是不同的东西。 Forms Authentication Timeout 值设置身份验证 cookie 设置为有效的时间量(以分钟为单位),这意味着,在 value 分钟数之后,cookie 将过期并且用户将不再进行身份验证——他们将被重定向自动进入登录页面。 slidingExpiration=true 值基本上是说只要用户在超时值内发出请求,他们就会继续被认证(更多细节here)。如果您设置slidingExpiration=false,则无论用户是否在超时值内发出请求,身份验证cookie 都会在value 分钟后过期。

SessionState timeout 值设置会话状态提供程序为特定会话在内存(或正在使用的任何后备存储、SQL Server、OutOfProc 等)中保存数据所需的时间量(以分钟为单位)。例如,如果您使用示例中的值将对象放入 Session 中,则此数据将在 30 分钟后删除。用户可能仍会通过身份验证,但 Session 中的数据可能不再存在。 Session Timeout 值总是在每次请求后按照建议 here 和 here 重置(可能需要 cookie;vs 无 cookie)

【讨论】:

一个澄清:表单身份验证超时设置Ticket 的到期时间,不一定是可能存储票证的cookie。 cookie 可能根本没有过期时间(混淆地称为会话 cookie,这意味着它会持续到用户关闭浏览器),或者甚至可能根本没有 cookie(“无cookie”表单身份验证)。在持久 cookie 的情况下,表单身份验证将 cookie 过期时间和票证过期时间设置为同一时间。 MSDN 的另一项澄清:“为了防止性能受损,并避免对打开 cookie 警告的用户发出多个浏览器警告,cookie 会在指定时间超过一半时更新。”所以cookie超时只有在它超过一半时才会被重置。因此建议将其设置为会话超时的 2 倍。【参考方案2】:

不同之处在于一个(表单超时)必须对用户进行身份验证,另一个(会话超时)与缓存数据在服务器上存储多长时间有关。所以它们是非常独立的东西,所以一个不会优先于另一个。

【讨论】:

【参考方案3】:

对于遇到此问题的任何人,请参阅 MS 的此文档 - 它有关于 FormsAuthentication Timeout 设置的非常好的详细信息。

本文档详细解释了 bmode 在接受的答案中所做的评论 - 关于持久性 Cookie(会话与过期)

https://docs.microsoft.com/en-us/aspnet/web-forms/overview/older-versions-security/introduction/forms-authentication-configuration-and-advanced-topics-cs#specifying-the-tickets-timeout-value

【讨论】:

【参考方案4】:
      <sessionState timeout="2" />
      <authentication mode="Forms">
          <forms name="userLogin" path="/" timeout="60" loginUrl="Login.aspx" slidingExpiration="true"/>
      </authentication>

此配置每两分钟将我发送到登录页面,这似乎与之前的答案有争议

【讨论】:

如果登录相关信息存储在会话变量中,并且在清除后,它会重定向到登录,则可能会发生这种情况。所以这取决于代码?【参考方案5】:

sliderExpiration=true 值基本上是说每次请求后,定时器都会被重置,只要用户在超时值内发出请求,他就会继续被认证。

这是不正确的。只有当超时时间已过一半时,身份验证 cookie 超时才会重置。

参见例如https://support.microsoft.com/de-ch/kb/910439/en-us 或https://itworksonmymachine.wordpress.com/2008/07/17/forms-authentication-timeout-vs-session-timeout/

【讨论】:

【参考方案6】:

不同之处在于一个(表单超时)与验证用户有关,另一个(会话超时)与缓存数据在服务器上存储多长时间有关。所以它们是非常独立的东西,所以一个不会优先于另一个。

【讨论】:

【参考方案7】:

据我了解,它们是相互独立的。通过保持会话超时小于或等于身份验证超时,您可以确保在身份验证超时后不会保留任何特定于用户的会话变量(如果这是您的问题,我认为这是正常的问题)题)。当然,您必须在注销时手动处理会话变量。

这是一个不错的回答,可以回答您的问题或至少为您指明正确的方向:

Forms Authentication Timeout vs Session Timeout

【讨论】:

以上是关于表单身份验证超时与 sessionState 超时的主要内容,如果未能解决你的问题,请参考以下文章

表单身份验证超时与会话超时

ASP.NET 窗体身份验证超时和会话超时

asp.net cookie、身份验证和会话超时

代码中的.net Access Forms身份验证“超时”值

Asp.net 形成身份验证 cookie 不遵守 IIS7 的超时

根据 ASP.NET 中的角色设置身份验证 cookie 超时长度