asp.net 10分钟后会话超时

6ie5vjzr  于 2022-11-19  发布在  .NET
关注(0)|答案(1)|浏览(176)

我们遇到了一个大问题。我们使用的是比利时eID(电子身份证,这是一种智能卡)。返回的Claim由表单身份验证使用。
一切正常,但10分钟后(活动或不活动,无关紧要),它会自动注销。
下面是我们创建会话的代码片段:

private void CreateSession(ClaimsPrincipal transformedPrincipal)
{
    SessionSecurityToken sessionSecurityToken = new SessionSecurityToken(transformedPrincipal, TimeSpan.FromHours(1));
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionSecurityToken);
}

Web.config中,我们设置了会话超时:

<sessionState cookieless="false" timeout="60" />

IIS服务器上,我们将应用程序池空闲超时设置为8小时。
我们还将回收的“Regular Time Interval”(定期时间间隔)设置为8小时。

yfjy0ee7

yfjy0ee71#

快攻

将会话设置为比表单超时时间晚2分钟。这样可以确保会话不会在验证失败的那一秒被终止。但是请记住,会话独立于表单(参见this blog)以了解更多详细信息。

<system.web>
   <authentication mode="Forms">
      <forms timeout="20" loginUrl="-- Login Page here --"/>
   </authentication>

   <sessionState mode="InProc" timeout="22"/>
</system.web>

深入调查

我会试着找出哪一个具体是超时的。这是一个相当容易的测试,会为你节省很多时间。
因此,所需的部分是超时时间为1分钟、会话数为10000的部分

<system.web>
   <authentication mode="Forms">
      <forms timeout="1" loginUrl="-- Login Page here --"/>
   </authentication>

   <sessionState mode="InProc" timeout="10000"/>
</system.web>

登录,浏览到一个页面,等待一分钟,刷新网站,你应该看到登录页面。
在您喜欢的浏览器中,打开开发者工具栏,浏览为该网站存储的Cookie。应该有2个Cookie:

  • ASP.NET_SessionId-跟踪会话
  • .ASPXAUTH-跟踪您的登录信息(除非您的浏览器因过期而将其删除)

您应该看到会话(ASP.NET_SessionId)的过期时间是将来的时间,但表单(.ASPXAUTH)已过期。
再次登录,您的会话应与之前相同。
反转设置,您应该会发现发生了相反的情况,即您登录了很长一段时间,但它正在重置。

跟踪会话结束事件

您可以尝试的另一个方法是在全局ASAX中。确保在web.config中使用sessionMode='InProc'并添加一个方法:

// Only works with sessionMode='InProc'
protected void Session_End(object sender, EventArgs e)
{
   if(Debugger.IsAttached)
      Debugger.Break();
}

当会话终止时,断点将命中,您可以通过调用堆栈追溯到会话终止的确切原因。当代码调用Session.Abandon()时,也会发生这种情况。

相关问题