会话超时后自动重定向到登录页面

3
我正在尝试在会话超时后自动重定向到登录页面。 我尝试在我的Main.Master页面中添加以下代码(所有其他页面都连接到此主页面):
protected void Page_Load(object sender, EventArgs e)
{
            //Redirects to Login Page 3 seconds before session timeout
            Response.AppendHeader("Redirect", Convert.ToString((Session.Timeout * 60) - 3) + "; URL=~/Login.aspx");
}

我在web.config中将会话超时设置为1分钟:

<sessionState mode="InProc" cookieless="false" timeout="1"/>

但是没有任何反应。

有人能帮我找到代码的问题吗?或者有其他想法可以使它正常工作吗?

编辑:来自web.config的身份验证节点。

<authentication mode="Forms">
    <forms name=".CAuthenticated" loginUrl="Login.aspx" protection="All" 
    timeout="20"/>
</authentication>

你能展示一下你的web.config文件吗?那里应该处理这个问题,而且你可以指定一个登录页面。 - Chris Knight
你是在IIS上运行还是使用Visual Studio内置的主机? - Chris Knight
@ChrisKnight Visual Studio内置的主机 - Inbal
Response.AppendHeader("Redirect", 60) 这是令服务器在响应浏览器请求时,将浏览器重定向到另一个页面的代码。如果您需要更多关于此的参考资料,请问一下其他开发者是否有相关经验或者查阅相关文档。 - Robin Maben
@RobinMaben - http://www.extremeexperts.com/Net/Articles/RedirectingPageAfterSessionTimeout.aspx - Inbal
4个回答

3
protected void Page_Init(object sender, EventArgs e)
{
    if (Session["Username"] == null)
    {
        Response.Redirect(ResolveClientUrl("~/login.aspx") + "?returnURL=" + HttpContext.Current.Request.Url.AbsolutePath);
    }
    else
    {
        lblUsername.Text = Session["Username"].ToString();
    }
}

1
我认为您需要在头部使用刷新而不是`重定向':
Response.AppendHeader("Refresh",
    Convert.ToString((Session.Timeout * 60) - 3) +
    ";URL=~/Login.aspx");

1

这里是我使用的一个例子,它对我有效:

    <authentication mode="Forms">
      <forms loginUrl="~/Login/Index" defaultUrl="~/Admin" timeout="20">
      </forms>
    </authentication>

如果您使用Forms身份验证,那么就不需要自己检查超时cookie了。

1

AppendHeader 的文档中指出,如果“在 HTTP 标头已发送后追加标头”,则会引发异常。您需要确保在 HTTP 标头发送之前调用 AppendHeader。根据您的母版页,Load 事件可能太晚了。您可以尝试使用 Init 事件。


当重定向起作用时,我得到的请求URL是:/website/Pages/~/Login.aspx。你知道为什么吗?看起来它获取的是内容页位置而不是应用程序根目录。 - Inbal
1
~/Login.aspx 只是文本,如果您想将其转换为相对 URL,请使用类似 VirtualPathUtility.MakeRelative 的东西。 - Peter Ritchie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接