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

163
我正在使用Membership.create用户函数,但出现以下错误,

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

我该如何解决?
22个回答

4
如果有人遇到了和我一样的错误,这是我的解决方案:
如果你使用了 Html.AntiForgeryToken();,请将其更改为 @Html.AntiForgeryToken()

4

在使用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)

通过清除该网站的站点数据解决问题: enter image description here

好的,它已经起作用了。但是这一直在发生。在Firefox中同样的项目可以正常运行。我该怎么办? - Can Ürek
@CanÜrek,您是否有多个不同的项目/站点使用相同的域名?例如localhost、app.site.com和app2.site.com等等?通常是由于这个原因导致的。 - Ogglas

3

在我的情况下,web.config文件中的错误域名是cookie不起作用的原因:

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

如果你正在本地计算机上工作,请键入<httpCookies domain="localhost" />,那么只有在本地计算机上才能使用cookies。如果您尝试在其他计算机上打开您的网站,则需要输入其IP地址(例如192.168.1.43),因为它正在寻找“localhost”,所以无法正常工作。 - user3419036

1
所有其他答案都是有效的,但如果它们都不能解决问题,那么检查实际头是否传递到服务器也是值得的。
例如,在nginx后面的负载平衡环境中,默认配置是在将请求传递给服务器之前剥离__RequestVerificationToken头,参见:simple nginx reverse proxy seems to strip some headers

0

我是这样解决的

[AttributeUsage(AttributeTargets.Method)]
public class ExcludeFromAntiForgeryValidationAttribute : Attribute{
}

并将 System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken) 放置在 if 条件中

bool shouldValidate =!filterContext.ActionDescriptor.GetCustomAttributes(typeof(ExcludeFromAntiForgeryValidationAttribute), true).Any();
if (shouldValidate){
    System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken);
}

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>

Javascript

$(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
这完全取决于你如何准备“myData”。如果你正在执行“myData=$('myForm').serialize()”,那么它应该可以正常工作。 - Sнаđошƒаӽ

0
在我的EPiServer解决方案中,对于几个控制器的Index操作,都有ContentOutputCache属性并接受HttpGet。这些操作的每个视图都包含一个表单,该表单将发布到同一控制器或不同控制器的HttpPost操作。 当我从所有这些Index操作中删除了该属性时,问题就消失了。

0

我想分享一下我的经验,我一直在使用ASP.NET MVC 4和AngularJS跟随防伪令牌教程,但每次使用$http.post请求时都会抛出异常,后来我发现解决方法就是在$http.post的头部添加'X-Requested-With': '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) { ....


0

因为这是第一次搜索出现的:

我只在Internet Explorer中遇到了这个问题,无法弄清楚问题所在。长话短说,它没有保存Token的cookie部分,因为我们的(子)域名中有一个下划线。在Chrome中工作正常,但IE/Edge不喜欢它。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接