47

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

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

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

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

在此处输入图像描述

登录操作

// 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);
        }
4

7 回答 7

48

I resolved the issue by explicitly adding a machine key in web.config.

Note: For security reason don't use this key. Generate one from https://support.microsoft.com/en-us/kb/2915218#AppendixA. Dont use online-one, details, 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" />

Here's a site that generates unique Machine Keys:

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

于 2013-08-08T06:58:39.130 回答
9

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

如果是这种情况,您可以使您的操作不被缓存,因此如果有人单击后退按钮并最终出现在带有 @Html.AntiForgeryToken() 的表单上,则不会缓存之前的令牌。

有关如何添加 [NoCache] ActionFilterAttribute: 如何处理表单提交 ASP.NET MVC 后退按钮的信息,请参阅此帖子?

于 2015-06-22T04:53:09.980 回答
3

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

于 2013-08-07T08:14:26.937 回答
3

我有这个问题很长一段时间,并认为这是 ASP.NET 的问题。

实际上,它是服务器。那时我在 WinHost,他们有 200MB 的内存限制。当我同时有大约 20 个用户时,我的限制就达到了。此时,每个人都已注销并产生了这些问题。

于 2013-12-27T16:12:19.727 回答
3

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

于 2015-05-21T10:27:01.640 回答
0

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

于 2020-12-04T09:09:28.650 回答
0

在我的情况下,它与域站点和子域站点设置的多个 cookie 值有关。

  • main.com 设置 __RequestVerificationToken = 1
  • sub.main.com 设置 __RequestVerificationToken = 2

但是当发送到 sub.main.com 的请求时,它使用了来自 main.com 的 __RequestVerificationToken = 1 值

于 2022-02-03T15:28:38.890 回答