Global.asax.cs中的Session_End未使用表单身份验证触发

时间:2010-12-15 18:12:22

标签: c# asp.net forms-authentication session-timeout

我有一个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");
}  

3 个答案:

答案 0 :(得分:4)

无法在Session_End方法中进行重定向。它不是由于请求而运行,因此它没有Response对象,并且没有响应任何地方的重定向。

由于会话过期,无法在浏览器中执行任何操作。 HTTP协议是面向请求的,所以没有浏览器要求它就无法将消息从服​​务器推送到浏览器。

浏览器无法确定会话是否已过期。如果您要轮询服务器以检查会话是否已过期,它将使会话保持活动状态,从而破坏超时的目的。

您可以使用客户端脚本在45分钟后进行重定向:

window.setTimeout(function() {
  window.location.href = '/Timeout.aspx';
}, 1000*45*60);

但是,这将仅根据此浏览器窗口上次联系服务器的时间进行重定向。如果同一会话有多个浏览器窗口,则会话可能实际上没有超时。

答案 1 :(得分:3)

您的会话状态如何实施? Session_End仅在使用InProc时有效。

请参阅http://www.eggheadcafe.com/articles/20021016.asp

答案 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.
}

How to Redirect on Session End