1

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

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

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

4

3 回答 3

2

John 解决方案的问题在于,缓存实际上非常有用,您可能不想从应用程序中删除此功能。

解决此问题的一种简单方法是在用户注销时强制您的输出 html 页面自行刷新。这可以通过在请求开始时使用 JavaScript 将 ajax 请求发送回您的服务器来完成,并验证用户是否仍然登录。如果用户已注销,只需执行客户端重定向到相同的页。这应该可以有效地解决您的问题。

于 2012-06-06T06:43:59.900 回答
2

您没有重新登录,您只是从浏览器缓存中查看页面。如果您尝试调试,您​​将看到浏览器上的后退按钮上没有执行任何代码。如果您在注销并按回后尝试单击某些内容,您将被重定向到登录页面(如果您保留默认的 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. 您可以通过触发浏览器客户端执行注销后强制刷新

    历史.go(1);

补充: 如果您从单个位置注销,您应该使用第一种方法,但如果您的注销按钮在布局页面上,禁用所有页面上的缓存会很糟糕,所以第二种方法似乎是要走的路。

于 2012-06-06T06:54:55.120 回答
1

当用户单击后退按钮时,浏览器只是重新显示缓存页面。

如果您希望浏览器不缓存页面并防止这种情况发生,您必须使用 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”继承,当您不希望它们允许用户使用后退按钮查看缓存页面时

于 2012-06-06T06:23:40.003 回答