ASP.net:注销时缓存问题

时间:2008-12-17 16:40:15

标签: asp.net

我在注销时找不到关于缓存的任何帖子,所以我要问这个问题。如果有类似的问题。请告诉我。

我有一个Logout页面,它基本上调用FormAuthentications注销方法,然后将用户重定向到登录页面。它工作正常,但问题是用户可以单击浏览器的后退按钮并获取缓存页面。我试图在我的母版页上设置no-cache标头,但这不起作用。

有人可以指点我的文章或教程,或者发布一些关于如何处理这种情况的提示吗?

感谢

7 个答案:

答案 0 :(得分:2)

根据您的要求,可能的解决方案可能是在每个经过身份验证的页面上将Cache-Control标头设置为“no-cache”。这将阻止页面缓存在下游。可以通过编写HttpModule

的自定义set the header来实现
// Prevent the browser from caching the ASPX page
Response.Cache.SetNoStore();

您还可以通过添加以下代码行在页面的HEAD部分进行设置:

<meta http-equiv="Cache-Control" content="no-cache" />

如果用户在注销后单击“后退”按钮,则会将其重定向到登录表单,而不是查看其最后一页的缓存版本,如果他使用的是公共计算机,则可能会出现问题。

答案 1 :(得分:1)

如果您正在使用表单身份验证,请确保在用户注销时删除表单身份验证Cookie。一旦用户在缓存页面(他们按下后退按钮的页面)上执行任何操作,该站点将要求用户重新登录,然后将其重定向回原始页面,并使用新数据。中提琴!

此外,关于页面的缓存,您需要设置相当多的标头来关闭浏览器和代理服务器中的缓存机制:

  • “过期” - 设置为过去的某个日期
  • “Last-Modified” - 设置为当前日期/时间
  • “Cache-Control” - 设置为“no-cache,must-revalidate”
  • “Pragma” - 设置为“no-cache”

这应该只是关于使页面不可缓存。日期/时间需要采用RFC1123格式(.net中的格式说明符“R”,例如“Mon,17 Apr 2006 21:22:48 GMT”)。您可以将其实现为:

Response.AddHeader("Expires", new DateTime(1940, 1, 1).ToString("R"));
Response.AddHeader("Last-Modified", DateTime.Now.ToString("R"));
Response.AddHeader("Cache-Control", "no-cache, must-revalidate");
Response.AddHeader("Pragma", "no-cache");

或类似的东西,具体取决于您要添加所有标题的位置。我在许多浏览器和代理服务器上取得了很大的成功,但是在页面缓存方面没有什么是万无一失的。

答案 2 :(得分:0)

没有万无一失的方法来实现这一目标。用户最终可以控制缓存设置,无缓存头不能覆盖这些。

您是否正在尝试解决此问题(安全性?),或者您只是想确保用户没有看到陈旧数据?

答案 3 :(得分:0)

这是一个难以解决的问题。您可以创建一个基页,在构造函数中,您可以检查该人是否已登录。如果此人未登录,只需重定向到登录页面即可。所有其他ASP.NET页面都将继承此基页。

答案 4 :(得分:0)

IE6似乎忽略了一些缓存标头。

缓存标题的另一种技术是使用某些客户端javascript检查身份验证cookie并使用history.Forward(),如果它不在那里。

答案 5 :(得分:0)

将此添加到global.asax,它将为Web应用程序中的所有页面设置no-cache标头。确保禁用缓存确实是您想要做的事情 - 因为缓存是一种性能优势。

当然,您也可以将相同的Response.Cache命令单独应用于页面。

这适用于FireFox 3,IE7,以及Opera 9.6。 (在Opera中,如果你任何帖子请求,它将起作用。如果你这样做,第一次仍然可以从后退按钮访问该页面,但之后不能访问。)

   protected void Application_PreSendRequestHeaders(object sender, EventArgs e)
    {
        if (!Request.Path.Contains("/Content/")) //We WANT images, css, javascripts to be cached!
        {
            //Otherwise, all of our pages contain sensitive information, and we don't want them cached.
            Response.Cache.SetCacheability(HttpCacheability.NoCache);
            Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); //for Opera. May only work on https sites
            Response.Cache.SetNoStore();
        }
    }

答案 6 :(得分:0)

你无法实际停止是行为人们已经删除后退按钮禁用它但用户仍然可以从任何浏览器的快捷方式控制,我的建议是对于你想要用户的所有那些页面登录使用POST方法,而不是常规GET使用帖子。这样做的是,当用户按下该URL的后退按钮时,浏览器会向用户询问一个警告框,以发布为此请求缓存的最后一个数据,并且将有一个服务器调用,其中表单身份验证将起作用。

使用post可能会有效,但它解决了你的问题。

相关问题