我目前正在使用用户身份验证的 MVC3 网站。
我有这个安全问题,我想阻止用户在成功从页面注销后按返回按钮重新登录。
我研究了很多解决方案,但是我不明白如何将它应用到我的项目中。在MVC3中可以做到吗?
我目前正在使用用户身份验证的 MVC3 网站。
我有这个安全问题,我想阻止用户在成功从页面注销后按返回按钮重新登录。
我研究了很多解决方案,但是我不明白如何将它应用到我的项目中。在MVC3中可以做到吗?
John 解决方案的问题在于,缓存实际上非常有用,您可能不想从应用程序中删除此功能。
解决此问题的一种简单方法是在用户注销时强制您的输出 html 页面自行刷新。这可以通过在请求开始时使用 JavaScript 将 ajax 请求发送回您的服务器来完成,并验证用户是否仍然登录。如果用户已注销,只需执行客户端重定向到相同的页。这应该可以有效地解决您的问题。
您没有重新登录,您只是从浏览器缓存中查看页面。如果您尝试调试,您将看到浏览器上的后退按钮上没有执行任何代码。如果您在注销并按回后尝试单击某些内容,您将被重定向到登录页面(如果您保留默认的 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);
}
}
您可以通过触发浏览器客户端执行注销后强制刷新
历史.go(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”继承,当您不希望它们允许用户使用后退按钮查看缓存页面时