2008-12-17 66 views
0

我无法在注销时发现有关高速缓存的任何帖子,所以我会问这个问题。如果有类似的问题。请告诉我。ASP.net:注销时出现高速缓存问题

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

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

谢谢

回答

0

有没有简单的方法来实现这一点。用户最终控制了缓存设置,而no-cache头不能覆盖这些设置。

是否有一个特别的问题,你试图在这里解决(安全?),或者你只是试图确保用户没有看到陈旧的数据?

+0

我只是不希望用户访问任何陈旧的数据。 – Jack 2008-12-17 17:00:56

+0

我似乎一旦注销了网站。用后退按钮不会回到上一页。您将得到一个会话超时错误页面,或者只是继续将您置于注销页面。 – Jack 2008-12-17 17:05:01

0

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

2

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

// Prevent the browser from caching the ASPX page 
Response.Cache.SetNoStore(); 

您还可以设置这个在您的网页的HEAD部分加入以下代码行:它可以通过编写自定义HttpModule即会set the header实现

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

通过这样做,如果用户点击后退按钮,他将被重定向到登录表单,而不是看到他最后一页的缓存版本,如果他使用的是公用计算机可能会出现问题。

1

如果您使用表单身份验证,请确保在用户注销时删除表单身份验证Cookie。只要用户对缓存页面(他们按下后退按钮所需的页面)执行了任何操作,网站就会要求用户重新登录,然后将其重新导向至原始页面,并提供最新数据。中提琴!

此外,关于网页缓存,你需要设置一个相当不错的数字头把浏览器和代理服务器的缓存机制关:

  • “过期” - 在设置为某个日期过去
  • “的Last-Modified” - 设置为当前的日期/时间
  • “缓存控制” - 设置为 “无缓存,必重新验证”
  • “语用” - 设置为“无缓存“

那应该只是关于使页面无法缓存。日期/时间需要采用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"); 

或类似的东西,取决于你想要添加所有标题的位置。我已经在许多浏览器和代理服务器上获得了很好的成功,但是关于页面缓存问题,没有什么是可以证明的。

0

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

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

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(); 
     } 
    } 
0

有是不是你可以实际停止的行为人们已经删除后退按钮禁用它,但用户仍然会从任何浏览器的捷径控制,我的建议是,所有那些你想要用户登录的页面放置他们在POST方法,而不是一般的GET使用后。这会做什么,只要用户按下该URL的后退按钮,浏览器就会向用户提示一个警告框,以发布为该请求缓存的最后一个数据,并且会有一个表单身份验证可以工作的服务器调用。

这是一个有点粗糙使用后可以得到工作,但它解决了你的问题。