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

cha*_*ara 43 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.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

登录操作

// 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);
        }
Run Code Online (Sandbox Code Playgroud)

cha*_*ara 47

我通过在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" />
Run Code Online (Sandbox Code Playgroud)

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

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

  • 希望这不是您在应用程序中放置的实际机器密钥,而是生成一个新的机器密钥:-) (19认同)
  • 这马上解决了我的问题.就像一个注释,它放在web.config中的<system.web>标记内. (8认同)
  • 您也可以通过单击任何网站,单击中间“ASP.NET”部分下的“Machine Key”,然后单击右侧的“Generate Keys”,在 IIS 中生成它们。 (4认同)
  • 你好..我遇到了与OP描述的问题相同的问题.我通过从http://aspnetresources.com/tools/machineKey获取一个密钥尝试了这个解决方案,并没有解决问题.但唯一的区别是,我并不总是看到这个错误.只是有时.我的是GoDaddy共享主机.有什么想法吗? (2认同)
  • 根据[Microsoft的文档](https://support.microsoft.com/en-us/help/2915218/resolving-view-state-message-authentication-code-mac-errors#AppendixA),您不应该使用第三方用于生成机器密钥的工具或网站.总是自己做. (2认同)

Yov*_*vav 9

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

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

请参阅这篇文章,了解如何添加[NoCache] ActionFilterAttribute: 如何处理表单提交ASP.NET MVC后退按钮?

  • 扫描仪,你在这里忽略了这一点,Ctrl + F5确实清除了缓存,但互联网用户不会知道他们需要这样做,而且它不应该发生. (3认同)