会话超时在 IIS 7 中如何工作?

Posted

技术标签:

【中文标题】会话超时在 IIS 7 中如何工作?【英文标题】:How does the session timeout work in IIS 7? 【发布时间】:2012-03-12 05:52:39 【问题描述】:

在 web.config 中,我将 sessionState 中的超时设置为 20 分钟。根据 MSDN,此超时指定会话在被放弃之前可以空闲的分钟数。在 IIS 7 中,DefaultWebSite->Session State->Cookie Settings->Time Out 自动填充了 web.config 中设置的超时值,在我的例子中是 20 分钟。另外,Application Pools->DefaultAppPool->Advanced Settings->idleTimeout,我设置为10分钟。

然后我做了两个测试: 第一次测试:我在下午 3 点 45 分登录了我的网络应用程序,闲置了 10 分钟。下午 3 点 55 分,我尝试使用我的应用程序,但被踢了出去。我认为 idleTimeout 发挥作用。

第二次测试:我在下午 4:00 登录我的网络应用程序,在下午 4:05、下午 4:10、下午 4:15 和下午 4:20 使用该应用程序。我预计会在下午 4 点 20 分被踢出去。但我不是。我认为 IIS 7 中的会话状态超时(20 分钟)是 Web 代理要求用户重新进行身份验证之前用户会话可以处于活动状态的最长时间。显然从这个测试,它不是。谁能给我解释一下?另外,我该如何设置上述情况的超时时间?

【问题讨论】:

【参考方案1】:

会话超时是一种滑动超时,用户每次访问服务器时都会将其重置为配置的值。

如果在这段时间内没有对您的应用程序的请求,则会启动应用程序空闲超时。

因此,通常的情况是:

Time User A User B Session States
12:00 Visits Page1 A: New Session, Time-out: 20 minutes
12:02 Visits Page2 A: Time-out reset: 20 minutes
12:10 Visits Page1 A: Time-out: 12 min; B: New: 20 minutes
12:15 Visits Page2 A: Time-out: 07 min; B: Time-out: 20 min
12:22 A: times out; B: 13 min remaining
12:32 Application Shuts Down (Idle time reached)
12:35 Visits Page3 A: New Session Starts

如果用户 A 在 12:22 之后返回站点,他们将拥有一个全新的会话,并且您之前存储在其中的任何值都将丢失。

确保会话在应用程序重新启动时持续存在的唯一方法是配置 SessionState 服务或 SQL 会话状态,并确保您拥有 configured the machine.key,这样它就不会在每次服务器重新启动时自动生成。

如果您使用标准的 ASP.NET 机制进行身份验证,那么 ASP.NET 将向每个用户发出两个 cookie:

    Authentication Token:由Authentication time-out设置控制,如果cookie没有过期,允许用户自动登录到您的站点,这可以是固定的或滑动的,默认为30分钟,这意味着他们的身份验证令牌可以处理比会话更长的“空闲”时间。 会话令牌:由会话超时设置控制,允许您的应用程序在访问期间存储和访问每个用户的值。

这两个 cookie 都使用 MachineKey 加密 - 因此,如果您的应用程序回收并生成新密钥,则这些令牌都无法解密,需要用户登录并创建新会话。


回应cmets:

    20 分钟会话超时与您使用 Session.Add(string, object) 方法放置在用户会话对象 (HttpSessionState) 中的项目有关。 这取决于。如果您的configured the machine.key 正确,身份验证令牌 仍然有效,并且如果您的会话不再是“InProc”,这些也将在应用程序重新启动后持续存在并且仍然可读 - 请参阅上面的注释。

【讨论】:

但是为什么我在第二次测试时不需要重新登录? 因为每次访问服务器时都会重置计时器 - 根据我的表。 谢谢 Zhaph,我还有两个问题,(1)20 分钟会有什么影响? (2) 应用关闭后B是否需要重新登录? 顺便说一句,我刚刚检查了我的 web.config,我们将表单超时设置为 2880 分钟。所以它不应该造成任何麻烦:) 感谢您的回复。我只是试图在我的环境中复制你的测试。有趣的是,12点22分,A的时间到了,但不知怎么的,A并没有被踢出去。我怀疑空闲超时被 B 重置了。你能指出哪些设置搞砸了吗?

以上是关于会话超时在 IIS 7 中如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

IIS 会话超时与 ASP.NET 会话超时

IIS中的会话超时和空闲超时有啥区别?

IIS中如何设置服务器session丢失问题。

windows7里的IIS里怎么设置session会话超时时间

如何防止共享主机上的 IIS 应用程序池中的空闲超时

async nlog 如何与 IIS 中托管的 webapi 一起工作?