使页面会话在 ASP MVC 3 中过期的可能方法?(“注销问题后按后退按钮”

本文关键字:方法 注销 问题 按钮 会话 ASP MVC 过期 | 更新日期: 2023-09-27 18:36:28

我目前正在使用用户身份验证的 MVC3 网站工作。

我有这个安全问题,我想防止用户在成功注销页面后按后退按钮重新登录。

我研究了很多解决方案,但是我不明白如何将其应用到我的项目中。有可能在 MVC3 中做到这一点吗?

使页面会话在 ASP MVC 3 中过期的可能方法?(“注销问题后按后退按钮”

您不是在重新记录,您只是在从浏览器缓存中查看页面。如果您尝试调试,您将看到浏览器上的后退按钮上没有执行任何代码。如果您在注销并按返回后尝试单击某些内容,您将被重定向到登录页面(如果您保留了默认的 mvc3 应用程序行为)。

有几种解决方案,这是我的看法:

  1. 您可以创建自定义 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);
        }
    }
    
  2. 您可以在执行注销后通过触发浏览器客户端来强制刷新

    历史网(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"。