防伪cookie令牌和表单字段令牌在MVC 4中不匹配

时间:2013-08-07 07:39:10

标签: asp.net asp.net-mvc asp.net-mvc-4

我正在使用ASP.NET MVC 4中的默认登录模块。我没有更改默认应用程序中的任何代码,而是将其托管在共享服务器上。

使用默认登录页面登录后。我让浏览器闲置了一段时间。当我尝试使用[Authorize]属性执行任何控制器操作时,显然应用程序重定向到登录页面。

然后我尝试再次登录,当我点击登录按钮时出现错误。

The anti-forgery cookie token and form field token do not match.

enter image description here

登录操作

// POST: /Account/Login

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Login(LoginModel model, string returnUrl)
        {
            if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
            {
                return RedirectToLocal(returnUrl);
            }

            // If we got this far, something failed, redisplay form
            ModelState.AddModelError("", "The user name or password provided is incorrect.");
            return View(model);
        }

7 个答案:

答案 0 :(得分:46)

我通过在web.config中明确添加机器密钥解决了这个问题。

注意:出于安全原因,请勿使用此密钥。从https://support.microsoft.com/en-us/kb/2915218#AppendixA生成一个。不要使用在线一,详情,http://blogs.msdn.com/b/webdev/archive/2014/05/07/asp-net-4-5-2-and-enableviewstatemac.aspx

 <machineKey validationKey="971E32D270A381E2B5954ECB4762CE401D0DF1608CAC303D527FA3DB5D70FA77667B8CF3153CE1F17C3FAF7839733A77E44000B3D8229E6E58D0C954AC2E796B" decryptionKey="1D5375942DA2B2C949798F272D3026421DDBD231757CA12C794E68E9F8CECA71" validation="SHA1" decryption="AES" />

这是一个生成唯一机器密钥的网站:

http://www.developerfusion.com/tools/generatemachinekey/

答案 1 :(得分:9)

出现此错误的另一个原因是,如果您在浏览器未缓存的[授权]区域之间跳转(这样做是为了阻止用户在签出和使用后退时看到受保护的内容按钮例如)。

如果是这种情况,您可以非缓存您的操作,那么如果有人单击后退按钮并最终使用@ Html.AntiForgeryToken(),则该令牌将不会被缓存。

有关如何添加[NoCache] ActionFilterAttribute的信息,请参阅此帖子: How to handle form submission ASP.NET MVC Back button?

答案 2 :(得分:6)

这是一个生成唯一机器密钥http://www.developerfusion.com/tools/generatemachinekey/

的网站

答案 3 :(得分:4)

确保将@ Html.AntiForgeryToken()放在页面的表单中

答案 4 :(得分:4)

我有很长一段时间遇到这个问题,并认为ASP.NET出了问题。

实际上,它是服务器。那时我和WinHost一样,他们有200MB的内存限制。只要我同时约有20个用户,就达到了限制。此时,每个人都已退出并解决了这些问题。

答案 5 :(得分:2)

对我来说,这是因为使用按钮标签提交表单。将其更改为输入提交标记可解决此问题。

答案 6 :(得分:0)

在我的情况下,“我们发现站点缓存已启用,并且由于此“防伪”令牌值在删除该缓存后并未每次都更新 表单正在提交。”