这个原因要从MVC 中的Html.AntiForgeryToken()说起了,呵呵。
MVC中的Html.AntiForgeryToken()是用来防止跨站请求伪造(CSRF:Cross-site request forgery)攻击的一个措施,它跟XSS(xss又叫css:Cross-Site-Script),攻击不同,xss一般是利用站内信任的用户在网站内插入恶意的脚本代码进行攻击,而csrf则是伪造成信任用户对网站进行攻击。
每一次登录的时候都会获取到一个验证码即:key,如: @Html.AntiForgeryToken(),在后台添加一个验证标签 如:
[HttpPost] [ValidateAntiForgeryToken]//验证标签 public ActionResult Login(LoginModel model) { }
登录完成之后,在利用浏览器的后退功能,返回到登录前的页面,这是利用浏览器的缓存。它获取到的那个key是没有被刷新的,还是原来的,这样再次登录,就会报错了。这种的解决方法应该有多种吧。
我是写了一个标签,去清除缓存,当后退到登录页面时,是在去刷新页面。这样不是缓存,而是再次刷新页面,重新获取这个key。
代码如下 清除缓存:
public class DisableCacheAttribute : ActionFilterAttribute { public override void OnResultExecuting(ResultExecutingContext filterContext) { var cache = filterContext.HttpContext.Response.Cache; cache.SetRevalidation(HttpCacheRevalidation.AllCaches); cache.SetNoStore(); cache.SetExpires(DateTime.UtcNow.AddDays(-1)); cache.SetValidUntilExpires(false); cache.SetCacheability(HttpCacheability.NoCache); }
在control加上这个标签:
[DisableCache]//清除缓存标签 public ActionResult Login(string ReturnUrl,string type) { ViewBag.ReturnUrl = ReturnUrl; ViewBag.logintype = type; return View(); }
(二)防止退出登录后 利用浏览器后退功能 回到登出前的页面
完全是处于对信息安全的考虑,因为一般都会设置session来控制用户对一些页面的非法访问。但是session防止不了浏览器的后退。也就是说你退出登录后,如果不关闭页面,还是有可能泄露信息的。下面两种方式,当然并不止两种,而且肯定有更好的方式。
(1)关闭旧页,打开新页:
function co(){ window.open(""); window.opener = null; window.close(); }
(2)页面自动刷新一次,这样即使后退,也是看到刷新后,经过session验证的页面
(a)通过url刷新:
function refresh(){ url = location.href; //把当前页面的地址赋给变量 url //分切变量 url 分隔符号为 "#" if( url.indexOf("#") == -1){ //如果url后没有# url += "#"; //加入 # self.location.replace(url); //刷新页面 } }
(b)通过cookie刷新
//自动刷新一次,如果没登录过,新建一个cookie:views 置为1,根据views是否有值判断是否是第一次浏览,如果是第一次就刷新。 function autoRefresh() { if (getCookie("views") != 1) { document.cookie = "views = 1"; if (getCookie("view") != 1) location.reload() else refresh();//如果浏览器不允许写cookie 则用url刷新方法,确保万无一失。 } else{ delCookie("views"); } } function getCookie(name) { //获取指定名称的cookie的值 var arrStr = document.cookie.split("; "); for ( var i = 0; i < arrStr.length; i++) { var temp = arrStr[i].split("="); if (temp[0] == name) return unescape(temp[1]); } return null; } function delCookie(name){ //为了删除指定名称的cookie,可以将其过期时间设定为一个过去的时间 var date = new Date(); date.setTime(date.getTime() - 10000); document.cookie = name + "=a; expires=" + date.toGMTString(); }