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

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

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

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

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

喜欢这个:

控制器

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

风景:

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

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

<httpCookies requireSSL="true" />

但是我的项目被设置为不使用SSL。 评论这条线或build立项目总是使用SSL解决了它。

另外请确保避免不使用[HttpGet]下的[ValidateAntiForgeryToken]。

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

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

另一个可能导致这个问题的原因是(如下):如果由于某种原因,在表单中禁用了所有的input字段。 它将禁用隐藏的input字段,持有您的validation令牌。 当表单将被回发时,令牌值将会丢失,并且会产生错误信息。 所以你需要做的是重新启用包含validation令牌的input字段,一切都会好的。

确保你的控制器中有你的http属性,如:

 [HttpPost] 

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

 [ValidateAntiForgeryToken] 

在你的观点你的forms,你必须写:

 @Html.AntiForgeryToken(); 

我有Html.AntiForgeryToken(); 在代码块中没有@符号的情况下,在Razor中没有发生错误,但在运行时发生了错误。 请确保您查看@ Html.Ant的@符号,如果丢失或不符合

在我的情况下,我有这个表单提交的JavaScript:

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

这是从提交的表单中删除隐藏的RequestVerificationToken。 我改变了:

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

…它工作得很好。

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

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

如果有人因为同样的原因而遇到错误,那么我的解决scheme是:

如果你有Html.AntiForgeryToken();

将其更改为@Html.AntiForgeryToken()

在我的几个控制器上的EPiServer解决scheme中,在接受HttpGet的Index操作中有一个ContentOutputCache属性。 这些操作的每个视图都包含一个张贴到HttpPost操作的表单到相同的控制器或不同的表单。 只要我从所有这些索引操作中删除了该属性,问题就消失了。

因为这是第一次search这个:

我只有在Internet Explorer中有这个问题,并不能找出问题是什么。 长话短说,它没有保存令牌的cookie部分,因为我们的(子)域有一个下划线。 在Chrome中工作,但IE / Edge并不喜欢它。

我想分享我的,我一直在使用asp.net mvc 4与angularjs这个反forgerytoken教程 ,但它会抛出一个exception,每次我请求使用$ http.post,我想出的解决scheme只是添加'X- Requested-With':'XMLHttpRequest'到$ http.post的头部,因为它看起来像(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); });


SaveController

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