我有一个asp.net 4.0应用程序,它使用表单身份验证设置为45分钟超时。我想在会话过期时将用户重定向到超时页面。谁能告诉我怎么做?我正在运行.net 4.0。
web.config有:
<authentication mode="Forms">
<forms name=".ASPXAUTH" loginUrl="~/Login.aspx"
defaultUrl="~/Default.aspx" protection="All" timeout="45"
requireSSL="false">
</forms>
</authentication>
Global.asax.cs文件有:
void Session_End(object sender, EventArgs e)
{
Response.Redirect("~/Timeout.aspx");
}
答案 0 :(得分:4)
无法在Session_End
方法中进行重定向。它不是由于请求而运行,因此它没有Response
对象,并且没有响应任何地方的重定向。
由于会话过期,无法在浏览器中执行任何操作。 HTTP协议是面向请求的,所以没有浏览器要求它就无法将消息从服务器推送到浏览器。
浏览器无法确定会话是否已过期。如果您要轮询服务器以检查会话是否已过期,它将使会话保持活动状态,从而破坏超时的目的。
您可以使用客户端脚本在45分钟后进行重定向:
window.setTimeout(function() {
window.location.href = '/Timeout.aspx';
}, 1000*45*60);
但是,这将仅根据此浏览器窗口上次联系服务器的时间进行重定向。如果同一会话有多个浏览器窗口,则会话可能实际上没有超时。
答案 1 :(得分:3)
您的会话状态如何实施? Session_End仅在使用InProc时有效。
答案 2 :(得分:0)
在MVC上,您可以在_ViewStart.cshtml中添加此代码
_ViewStart.cshtml:
@{
Response.AddHeader("Refresh",Convert.ToString((Session.Timeout * 60) + 5));
if(Session.IsNewSession)
Response.Redirect(“Logout.aspx");// or another page which you want.
}