我们遇到了一个很大的问题。
我们使用比利时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小时。
我们还将回收的常规时间间隔设置为8小时。
答案 0 :(得分:0)
快速入侵:
比表单超时晚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()
时实现。