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

26
在web.config中,我将sessionState的超时设置为20分钟。根据MSDN,这个超时指定会话在闲置多长时间后被放弃。在IIS 7中,默认网站->会话状态->cookie设置->超时时间自动填充为web.config中设置的超时值,即我这里设置的20分钟。此外,应用程序池->默认应用程序池->高级设置->空闲超时,我将其设为10分钟。
然后我进行了两次测试: 第一次测试:我在下午3:45登录我的Web应用程序,闲置了10分钟。在下午3:55,我尝试使用我的应用程序,但被踢出了。我认为是空闲超时起作用了。
第二次测试:我在下午4:00登录我的Web应用程序,在4:05、4:10、4:15和4:20玩了一会儿。我预计在下午4:20被踢出。但我没有被踢出。我认为在IIS 7中,会话状态超时(20分钟)是用户会话在Web代理要求用户重新身份验证之前可以活动的最长时间。从这个测试中显然不是这样。有人能解释一下吗?另外,我该如何设置上述情况的超时时间?
1个回答

39

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

如果应用程序在该时间段内没有收到任何请求,则应用程序空闲超时将启动。

因此,通常的情况是:

时间 用户A 用户B 会话状态
12:00 访问页面1 A:新会话,超时时间:20分钟
12:02 访问页面2 A:超时时间重置:20分钟
12:10 访问页面1 A:超时时间:12分钟;B:新的超时时间:20分钟
12:15 访问页面2 A:超时时间:07分钟;B:超时时间:20分钟
12:22 A:超时;B:剩余13分钟
12:32 应用程序关闭(达到闲置时间)
12:35 访问页面3 A:新会话开始
如果用户A在12:22之后返回该网站,他们将拥有一个全新的会话,之前存储的任何值都将丢失。
确保会话在应用程序重新启动时持久存在的唯一方法是配置SessionState服务或SQL会话状态,并确保您已经配置了machine.key,以便每次服务器重新启动时不是自动生成的。
如果您使用标准的ASP.NET身份验证机制,则ASP.NET会向每个用户发出两个cookie:
1.身份验证令牌:由Authentication time-out设置控制,如果cookie尚未过期,则允许用户自动登录到您的站点,这可以是固定或滑动的,并默认为30分钟,这意味着他们的身份验证令牌可以处理比他们的会话更长的“空闲”时间。
2.会话令牌:由会话超时设置控制,在用户访问期间允许您的应用程序存储和访问每个用户的值。

这两个Cookie都使用MachineKey进行加密 - 所以如果您的应用程序重新启动并生成一个新的密钥,那么这两个令牌都无法解密,需要用户重新登录并创建新会话。


回复评论:

  1. 20分钟的会话超时是指您使用Session.Add(string, object)方法将项目放置在用户会话对象(HttpSessionState)中。
  2. 这取决于情况。如果您已经正确配置机器密钥身份验证令牌仍然有效。如果您的会话不再是“InProc”,则这些数据也会持久保存,并且仍然可以被读取——请参阅上面的注释。

因为根据我的表格,每次访问服务器时计时器都会被重置。 - Zhaph - Ben Duguid
谢谢 Zhaph,我还有两个问题,(1) 20分钟会影响什么?(2) 应用程序关闭后,B需要重新登录吗? - GLP
感谢您的回复。我刚刚尝试在我的环境中复制您的测试。有趣的是,在12:22时,A的时间到了,但不知何故A没有被踢出。我怀疑空闲超时被B重置了。您能告诉我哪些设置出了问题吗? - GLP
你实际上是如何管理用户认证的?在会话中存储了什么?如果你使用的是超时为2880分钟(2天)的身份验证提供程序,那么在仅仅22分钟后他们不会被“踢出”。但是,如果你已经存储了任何会话变量,这将不再可访问。 - Zhaph - Ben Duguid
在我的Web.config文件中,我有这个<sessionState timeout="60"></sessionState>和<forms loginUrl="~/Default.aspx" timeout="2880"/>。 - GLP
显示剩余2条评论

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