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


141

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

所需的反伪造表单字段“ __RequestVerificationToken”不存在

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

Answers:


218

[ValidateAntiForgeryToken]在执行操作之前,您具有属性。您还应该@Html.AntiForgeryToken()在表格中添加。


11
我有一个存在相同问题的网页,但总体而言是正确的。怎么了
ConductedClever 2014年

:@ConductedClever你应该在这篇文章中仔细检查与小提琴手和/或萤火虫(任何浏览器开发工具),看一切(场,饼干)asp.net/web-api/overview/security/...
webdeveloper

也请@Conducted 那是工作,但很少会出现此错误,我不知道为什么?
QMaster 2014年

在我的测试中,我认为一切正常,直到最近才在客户端计算机上工作,但现在却出现此错误。我不知道为什么。除了这里列出的想法,还有其他想法吗?
安德烈·多布林

1
Html.AntiForgeryToken();不起作用!变成@Html.AntiForgeryToken()作品
FindOutIslamNow

78

就我而言,我的web.config中包含以下内容:

<httpCookies requireSSL="true" />

但是我的项目设置为不使用SSL。注释掉该行或将项目设置为始终使用SSL即可解决该问题。


3
在我的情况下,web.config具有requireSSL,但是端口80和443都有IIS绑定,因此,键入https的用户将获得正确的行为,键入http的用户将得到此错误,并输入了重写规则以将所有内容强制设置为https:/ / {HTTP_HOST} / {R:1}修复了该问题
user1069816

谢谢😃在我的案例中,IIS存在此绑定(https » EmptyHostName » IP » 443),但没有针对(https » www.mysite.com » IP » 443)的绑定。所以我增加了一个新的具有约束力的非空主机名https,这是等于域和它解决了这个问题。我也要IIS强制重写设置http 2 https
RAM

61

像这样:

控制器

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

风景:

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

尝试仅在HTML中使用
Subrata Sarkar

41

还要确保避免不使用[HttpGet]下的[ValidateAntiForgeryToken]。

  [HttpGet]
  public ActionResult MethodName()
  {
  ..
  }

1
这个答案是对其他人的补充,解决了我的问题!谢谢
卢卡斯

1
该答案假定您不保存任何提交的数据(不应将其保存在HttpGet上)。如果是这样,那么您仍然需要[ValidateAntiForgeryToken]提供的XSRF保护。
thelem

9

即使未启用Cookies,您也​​会收到错误消息。


2
打得好。我正在使用Internet Explorer。使用Chrome浏览器为我解决了问题
FindOutIslamNow

这也解决了我的问题。在谷歌浏览器中启用Cookie。谢谢
科学方法

7

可能导致此情况的另一件事(只是遇到了这种情况)如下:如果出于某种原因禁用了表单中的所有输入字段。它将禁用保存您的验证令牌的隐藏输入字段。当表单将被发回时,令牌值将丢失,并会生成丢失的错误。因此,您需要做的是重新启用包含验证令牌的输入字段,一切都会顺利进行。


6

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

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


5

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

[HttpPost]

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

[ValidateAntiForgeryToken]

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

@Html.AntiForgeryToken();

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


5

就我而言,我在表单提交中使用了以下javascript:

$('form').submit(function () {
    $('input').prop('disabled', true);
});

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

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

...而且效果很好。


禁用输入后,您如何注意到该反键受到影响?
Cer

1
@Cer-如果您问我如何注意到,我与提琴手一起检查了请求,然后得知未发送密钥。我读到的HTML提交不会包含禁用的控件。因此,我将其更改为readonly并排除了隐藏的控件。似乎工作得很好。
肖恩

3

如果有人由于相同的原因而遇到错误,请使用以下解决方案:

如果你有 Html.AntiForgeryToken();

更改为 @Html.AntiForgeryToken()


2

在我的情况下,cookie的web.config中的域不正确是原因:

<httpCookies domain=".wrong.domain.com" />

eep!如果您在本地计算机上键入<httpCookies domain =“ localhost” />,则仅在本地计算机cookie上有效,并且如果尝试在其他计算机上打开站点,则将输入无效的ip(fe 192.168.1.43)它寻找“本地主机”
user3419036 '19

2

在我的情况下,这是由于添加requireSSL=truehttpcookieswebconfig中导致AntiForgeryToken停止工作。例:

<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>

为了使双方requireSSL=true@Html.AntiForgeryToken()工作,我加入这一行里面Application_BeginRequestGlobal.asax

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

2

在Chrome中使用个人用户帐户默认登录ASP.NET在Chrome中遇到此错误

.cshtml:

@using (Html.BeginForm("Login", "Account", new { ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
    @Html.AntiForgeryToken()
    <h4>Use a local account to log in.</h4>

控制器:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)

通过清除站点的站点数据来解决:

在此处输入图片说明


好吧,它的工作。但这一次又一次地发生。在Firefox中,同一项目运行正常。我能做什么?
CanÜrek

@CanÜrek您是否有几个具有相同域的不同项目/站点?例如localhost,app.site.com和app2.site.com等?因此,通常会发生这种情况。
奥格拉斯

0

在我的几个控制器上的EPiServer解决方案中,Index动作的ContentOutputCache属性接受了HttpGet。这些操作的每个视图都包含一个表单,该表单已张贴到HttpPost动作中,该表单也发送到同一控制器或其他控制器。一旦我从所有这些索引操作中删除了该属性,问题就消失了。


0

因为这是第一次搜索:

我仅在Internet Explorer中遇到此问题,无法弄清楚问题是什么。长话短说,它没有保存令牌的cookie部分,因为我们的(子)域中带有下划线。在Chrome中工作,但IE / Edge不喜欢它。


0

此处的所有其他答案也都有效,但是如果它们都不能解决问题,则还应检查是否将实际的标头传递给服务器。

例如,在nginx后面的负载平衡环境中,默认配置是在将请求传递到服务器之前剥离__RequestVerificationToken标头,请参阅:简单的nginx反向代理似乎剥离了一些标头


0

有时您正在编写带有结果列表的表单操作方法。在这种情况下,您不能使用一种操作方法。因此,您必须具有相同名称的两个操作方法。一个与[HttpGet]另一个具有[HttpPost]属性。

在您的[HttpPost]操作方法中,设置[ValidateAntiForgeryToken]属性并放入@Html.AntiForgeryToken()html表单中。


0

在我的情况下,我在发布AJAX帖子时遇到此错误,结果是__RequestVerificationToken值未在调用中传递。我必须手动查找此字段的值,并将其设置为发送到端点的数据对象的属性。

data.__RequestVerificationToken = $('input[name="__RequestVerificationToken"]').val();


的HTML

  <form id="myForm">
    @Html.AntiForgeryToken()

    <!-- other input fields -->

    <input type="submit" class="submitButton" value="Submit" />
  </form>

Java脚本

$(document).on('click', '#myForm .submitButton', function () {
  var myData = { ... };
  myData.__RequestVerificationToken = $('#myForm input[name="__RequestVerificationToken"]').val();

  $.ajax({
    type: 'POST',
    url: myUrl,
    data: myData,
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',
    dataType: 'json',
    success: function (response) {
      alert('Form submitted');
    },
    error: function (e) {
      console.error('Error submitting form', e);
      alert('Error submitting form');
    },
  });
  return false; //prevent form reload
});

控制者

    [HttpPost]
    [Route("myUrl")]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> MyUrlAsync(MyDto dto)
    {
        ...
    }

实际上,如果您要定义MyDto类的结构,那么它将非常有帮助
Chandan Kumar

好吧,我不确定它是否真的会很有帮助,并且示例代码现在已经不复存在了,所以可以说public class MyDto { public bool Whatever { get; set; } }
demoncodemonkey

-1

我想分享我的经验,我一直在 使用这个使用asp.net mvc 4和angularjs的反伪造令牌教程,但是每次我使用$ http.post请求时,它都会引发异常,而我发现解决方案只是添加 'X- Requested-With': $ http.post标头的'XMLHttpRequest',因为它看起来像(filterContext.HttpContext.Request.IsAjaxRequest()) 无法将其识别为ajax,这是我的示例代码。

App.js

var headers = { 'X-Requested-With': 'XMLHttpRequest', 'RequestVerificationToken': $scope.token, 'Content-Type': 'application/json; charset=utf-8;' };

$http({ method: 'POST', url: baseURL + 'Save/User', data: JSON.stringify($scope.formData), headers: headers }).then(function (values) { alert(values.data); }).catch(function (err) { console.log(err.data); });


保存控制器

[HttpPost] [MyValidateAntiForgeryToken] public ActionResult User(UserModel usermodel) { ....

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.