【发布时间】:2012-08-24 13:14:23
【问题描述】:
我阅读了许多帖子,其中人们遇到了类似的问题,但还没有找到有效的解决方案。我有一个 MVC 4 站点,我不想从整个网站中删除缓存,因为我想缓存页面。当用户单击注销按钮时,它会成功注销并重定向到登录页面,但是当用户单击后退按钮时,它会显示以前查看过的“受限页面”,您应该只能在登录后才能看到。我知道这是因为浏览器已经缓存了页面客户端。我尝试了许多解决方案,如前所述,它们都不起作用。目前我的注销有以下代码:
public ActionResult LogOff()
{
FormsAuthentication.SignOut();
Session.Abandon();
Session.Clear();
// clear authentication cookie
HttpCookie cookie1 = new HttpCookie(FormsAuthentication.FormsCookieName, "");
cookie1.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie1);
// clear session cookie (not necessary for your current problem but i would recommend you do it anyway)
HttpCookie cookie2 = new HttpCookie("ASP.NET_SessionId", "");
cookie2.Expires = DateTime.Now.AddYears(-1);
Response.Cookies.Add(cookie2);
// Invalidate the Cache on the Client Side
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
Response.Cache.SetNoStore();
Response.AppendHeader("Pragma", "no-cache");
// send an expired cookie back to the browser
var ticketExpiration = DateTime.Now.AddDays(-7);
var ticket = new FormsAuthenticationTicket(
1,
// replace with username if this is the wrong cookie name
FormsAuthentication.FormsCookieName,
DateTime.Now,
ticketExpiration,
false,
String.Empty);
var cookie = new System.Web.HttpCookie("user")
{
Expires = ticketExpiration,
Value = FormsAuthentication.Encrypt(ticket),
HttpOnly = true
};
Response.Cookies.Add(cookie);
return RedirectToAction("Login", "Account");
}
【问题讨论】:
-
我不知道您是如何进行身份验证的。但是,不应该每个网站都检查您的数据库以确保用户在网站上有适当的身份验证吗?如果没有,它应该重定向他显示的东西。即使您的页面被缓存,您的脚本仍然会运行,并且存储在数据库中的用户会话应该显示他已注销。
-
当然不行,你的过期码只影响当前请求是否被缓存。当前请求是您的注销代码,因此只有注销页面不会被缓存。您无法在缓存页面后追溯删除它们。
标签: asp.net-mvc asp.net-mvc-4 browser-cache back-button