Asp.net 使用SqlServer模式时,会话超时不起作用
我正在开发ASP.NETMVC应用程序 我们使用了sessionState模式SQLServer,我将超时设置为20分钟Asp.net 使用SqlServer模式时,会话超时不起作用,asp.net,sql-server,asp.net-mvc,session,Asp.net,Sql Server,Asp.net Mvc,Session,我正在开发ASP.NETMVC应用程序 我们使用了sessionState模式SQLServer,我将超时设置为20分钟 <sessionState mode="SQLServer" sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa" cookieless="false" timeout="2" /> web
<sessionState mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;user id=sa;password=sa"
cookieless="false"
timeout="2" />
web配置中的代码类似于此
我还设置了登录页面
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
并且还发现
编辑:-
每当为该会话执行另一个http请求时,我想将用户重定向到登录页面。通常浏览器不知道服务器上发生了什么。除非发生HTTP往返,否则它将记住呈现页面时的会话状态
此外,您的会话cookie可能是HttpOnly,因此页面无法检查会话cookie的存在
实现您想要的目标的一种方法是:
将隐藏的iFrame添加到页面。将iFrame的SRC设置为网站中的处理程序
处理程序不需要做很多事情,只需返回一个200OK,再加上一个设置为几秒钟的刷新头,这样处理程序就可以得到持续的轮询
context.Response.AddHeader("REFRESH", "2");
将framebreaker代码添加到登录页面
if (top.location != location) {
top.location.href = document.location.href ;
}
当处理程序的请求与过期会话一起出现时,它将通过表单身份验证重定向到登录页面;当登录页面返回时,它将中断iFrame并将整个窗口重定向到登录页面
<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>
或者,您可以像其他人一样,等待用户请求另一个页面。对我来说,将web.config文件中的超时值更改为“没有发生任何事情”,原因是ASPState数据库中的ASPStateTempSessions表中有一些遗留的旧记录。我必须清空表,然后才对web.config进行了更改。我浪费了一个小时试图寻找原因,所以希望这能帮助别人
因此,运行以下命令:
从ASPStateTempSessions删除InProc模式和SQLServer模式之间的区别在于SQLServer依赖MSSQL作业来删除会话。它不会阻止您再次登录
看
SqlSessionStateStore不会主动监视Expires字段。相反,它依赖外部代理清理数据库并删除过期会话,这些会话的Expires字段中的日期和时间小于当前日期和时间。ASPState数据库包含一个SQL Server代理作业,该作业定期(默认情况下,每60秒)调用存储过程DeleteExpiredSessions以删除过期会话
当页面发出另一个http请求时,甚至可以确定会话是否过期。当它发现会话在另一个http请求上过期时,我想将用户重定向到登录操作方法。会话采用滑动超时。每次再次访问网站时,会话超时都会重置。@ChrisPratt Ok。我应该如何处理这种情况?是因为SQLServer模式吗?我就是这么说的。你不能。当用户处于活动状态时,会话将永远不会超时,无论是20分钟还是2小时。如果用户空闲,并且会话确实超时,则下一个请求将简单地启动一个新会话。您最可能要做的是将身份验证设置为在20分钟后过期。这必然会迫使用户在20分钟后重新登录,因为这不是滑动。