我在 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);
}
我通过在 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" />
这是一个生成唯一机器密钥的网站:
出现此错误的另一个原因是,如果您在浏览器未缓存的[授权]区域之间跳转(这是故意这样做的,以便阻止用户在注销并使用后退按钮时看到受保护的内容)示例)。
如果是这种情况,您可以使您的操作不被缓存,因此,如果有人单击后退按钮并最终进入带有 @Html.AntiForgeryToken() 的表单,则之前的令牌将不会被缓存。
请参阅这篇文章了解如何添加 [NoCache] ActionFilterAttribute: 如何处理表单提交ASP.NET MVC后退按钮?
确保将 @Html.AntiForgeryToken() 放入页面表单中
这个问题我困扰了很长时间,并认为是 ASP.NET 出了问题。
实际上,是服务器。我当时用的是WinHost,他们有200MB的内存限制。当我同时有大约 20 个用户时,我的极限就达到了。此时,每个人都已注销并产生了这些问题。
对我来说,这是由于使用按钮标签提交表单引起的。将其更改为输入提交标签可以解决该问题。
在我的例子中,“我们发现站点缓存已启用,并且由于此“防伪造”令牌值在删除此缓存后并未每次更新 表单正在提交。”
就我而言,它与域站点和子域站点设置的多个 cookie 值有关。
但是当向 sub.main.com 发送请求时,它使用了来自 main.com 的 __RequestVerificationToken = 1 值
在我的例子中,我向 cookie 令牌参数提供表单令牌,反之亦然。