使页面会话在 ASP MVC 3 中过期的可能方法?(“注销问题后按后退按钮”
本文关键字:方法 注销 问题 按钮 会话 ASP MVC 过期 | 更新日期: 2023-09-27 18:36:28
我目前正在使用用户身份验证的 MVC3 网站工作。
我有这个安全问题,我想防止用户在成功注销页面后按后退按钮重新登录。
我研究了很多解决方案,但是我不明白如何将其应用到我的项目中。有可能在 MVC3 中做到这一点吗?
您不是在重新记录,您只是在从浏览器缓存中查看页面。如果您尝试调试,您将看到浏览器上的后退按钮上没有执行任何代码。如果您在注销并按返回后尝试单击某些内容,您将被重定向到登录页面(如果您保留了默认的 mvc3 应用程序行为)。
有几种解决方案,这是我的看法:
-
您可以创建自定义 ActionFilterAttribute,以防止在控制器上缓存,或/和这样的操作,然后简单地将其应用于操作/控制器:
public class NoClientCache : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { filterContext.HttpContext.Response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); filterContext.HttpContext.Response.Cache.SetValidUntilExpires(false); filterContext.HttpContext.Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); filterContext.HttpContext.Response.Cache.SetCacheability(HttpCacheability.ServerAndNoCache); filterContext.HttpContext.Response.Cache.SetNoStore(); base.OnResultExecuting(filterContext); } }
-
您可以在执行注销后通过触发浏览器客户端来强制刷新
历史网(1);
添加:如果您从单个位置注销,则应使用第一种方法,但是如果您的注销按钮位于布局页面上,则在所有页面上禁用缓存会很糟糕,因此第二种方法似乎是要走的路。
John 解决方案的问题在于缓存实际上非常有用,您可能不想从应用程序中删除此功能。
解决此问题的一种简单方法是在用户注销时强制输出 html 页面自行刷新。 这可以通过使用 JavaScript 在请求开始时将 ajax 请求发送回您的服务器,并验证用户是否仍处于登录状态来实现。 如果用户已注销,只需执行客户端重定向到同一页面即可。 这应该可以有效地解决您的问题。
当用户单击后退按钮时,浏览器只是重新显示缓存的页面。
如果您希望浏览器不缓存页面并防止这种情况发生,则必须使用 HTTP 响应标头对其进行指示。
您需要运行以下代码以及您不希望缓存的每个 HTTP 响应:
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Cache-Control", "private"); //to be safe cross browser
如果将此代码包含在自定义基本控制器(如下)中,则可以避免整个站点的代码重复:
public class CustomBaseController : Controller
{
protected override void OnResultExecuting(ResultExecutingContext context)
{
HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
HttpContext.Current.Response.AddHeader("Cache-Control", "private"); //to be safe cross browser
}
}
如果您使用上述方法,请确保在不希望它们允许用户使用后退按钮查看缓存页面时,将所有控制器都继承自"CustomBaseController"。