所需的防伪表单字段"__RequestVerificationToken"不存在用户注册中的错误

Hem*_*oni 136 asp.net-membership asp.net-mvc-4

我正在使用Membership.create用户功能,然后发生以下错误,

所需的防伪表单字段"__RequestVerificationToken"不存在

我怎样才能解决这个问题?

web*_*per 212

[ValidateAntiForgeryToken]在行动之前你有属性.您还应该@Html.AntiForgeryToken()在表单中添加.

  • 我有一个网页有相同的问题,但一切都是正确的.什么是错误. (9认同)

Jus*_*les 75

在我的情况下,我在我的web.config中有这个:

<httpCookies requireSSL="true" />

但我的项目设置为不使用SSL.注释掉该行或设置项目以始终使用SSL解决了它.

  • 在我的情况下,web.config有requireSSL,但是端口80和443都有IIS绑定,因此输入https的用户获得了正确的行为,输入http的用户收到此错误,输入重写规则强制所有https://{HTTP_HOST}/{R:1}修复了它 (3认同)

Sub*_*kar 61

像这样:

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
     ...
     Code Block
     ...
}
Run Code Online (Sandbox Code Playgroud)

风景:

@using(Html.BeginForm())
{
     @Html.AntiForgeryToken()
     <input name="..." type="text" />
     // rest
}
Run Code Online (Sandbox Code Playgroud)

  • 我有这两个 - 我仍然得到错误?! (3认同)

Hai*_*Fan 39

另外,请确保避免在[HttpGet]下使用[ValidateAntiForgeryToken].

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }
Run Code Online (Sandbox Code Playgroud)

  • 这个答案假设您没有保存任何提交的数据(您不应该在 HttpGet 上)。如果是,那么您仍然需要 [ValidateAntiForgeryToken] 提供的 XSRF 保护。 (2认同)

Ege*_*rak 10

就我而言,这是由于在 webconfig 中添加requireSSL=true导致httpcookiesAntiForgeryToken 停止工作。例子:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
Run Code Online (Sandbox Code Playgroud)

为了使两者requireSSL=true@Html.AntiForgeryToken()工作,我在Application_BeginRequestin中添加了这一行Global.asax

    protected void Application_BeginRequest(object sender, EventArgs e)
  {
    AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
  }
Run Code Online (Sandbox Code Playgroud)


Vij*_*dar 7

即使未启用Cookie,您也会收到错误消息.

  • 好打.我在使用Internet Explorer.使用Chrome浏览器解决了我的问题 (2认同)

小智 6

另一件可能导致此问题的事情(刚刚遇到此问题)如下:如果由于某种原因禁用表单中的所有输入字段.它将禁用包含验证令牌的隐藏输入字段.当表单将被回发时,将丢失令牌值并将生成错误的错误.所以你需要做的是重新启用包含验证令牌的输入字段,一切都会很好.


juF*_*uFo 5

确保在控制器中具有http属性,例如:

[HttpPost]
Run Code Online (Sandbox Code Playgroud)

还要在控制器中添加属性:

[ValidateAntiForgeryToken]
Run Code Online (Sandbox Code Playgroud)

在视图上的表单中,您必须编写:

@Html.AntiForgeryToken();
Run Code Online (Sandbox Code Playgroud)

我有Html.AntiForgeryToken(); 在代码块中没有@符号时,它在Razor中没有给出错误,但在运行时出现了。确保您查看@ Html.Ant ..的@符号。


Sea*_*ean 5

就我而言,我在表单Submit上使用了以下javascript:

$('form').submit(function () {
    $('input').prop('disabled', true);
});
Run Code Online (Sandbox Code Playgroud)

这是从提交的表单中删除隐藏的RequestVerificationToken。我将其更改为:

$('form').submit(function () {
    $('input[type=submit]').prop('disabled', true);
    $('input[type=text]').prop('readonly', true);
    $('input[type=password]').prop('readonly', true);
});
Run Code Online (Sandbox Code Playgroud)

...而且效果很好。

  • @Cer - 如果你问我是怎么注意到的,我用 fiddler 检查了请求并发现密钥没有被发送。我读到 Html 提交不会包含禁用的控件。所以我将其更改为“只读”并排除了隐藏控件。看起来效果很好。 (2认同)

Geo*_*ffM 5

我们这些人作为请求的一部分上传文件的另一种可能性.如果内容长度超过<httpRuntime maxRequestLength="size in kilo bytes" /> 并且您正在使用请求验证令牌,则浏览器将显示'The required anti-forgery form field "__RequestVerificationToken" is not present'消息而不是超出请求长度消息.

将maxRequestLength设置为足以满足请求的值可以解决当前问题 - 尽管我承认这不是一个合适的解决方案(我们希望用户知道文件大小的真正问题,而不是请求验证令牌丢失的问题).