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

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

所需的防伪表单字段“ _ _ RequestVerificationToken”是 不在场

我该怎么补救?

248251 次浏览

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

像这样:

控制者

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

观点:

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

还要确保不要使用[ ValidateAntiForgeryToken ] 在[ HttpGet ]下。

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

即使未启用 Cookie,您也会收到错误。

在我的例子中,我在 web.config 中有这个:

<httpCookies requireSSL="true" />

但是我的项目被设置为不使用 SSL。注释掉该行或设置项目始终使用 SSL 解决了这个问题。

另一个可能导致这种情况的原因是: 如果出于某种原因禁用了表单中的所有输入字段。 它将禁用保存验证令牌的隐藏输入字段。 当表单将被回发时,令牌值将丢失,并将生成它所丢失的错误。因此,您需要做的是重新启用保存验证令牌的输入字段,这样一切都会好起来。

在我的案例中,在 web.config 中 Cookie 的域名不正确是原因:

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

如果有人因为和我一样的原因经历了这个错误,我的解决办法是:

如果你有 Html.AntiForgeryToken();

改成 @Html.AntiForgeryToken()

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

[HttpPost]

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

[ValidateAntiForgeryToken]

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

@Html.AntiForgeryToken();

我有 Html。AntiForgeryToken () ; 在代码块中没有@符号时,它在 Razor 中不会出错,但在运行时会出错。如果@Html. Ant 的符号丢失或者没有丢失,一定要查看它的@符号

在我的例子中,我在表单提交时使用了这个 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);
});

效果很好。

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

我想分享我的,我一直遵循这个反伪造令牌教程 使用 asp.net mvc 4和 angularjs,但是每次我使用 $http.post 请求它都会抛出一个异常,我发现解决方案就是添加 ‘ X-Request-With’: ‘ XMLHttpRequest’ 到 $http.post 的标题,因为它看起来像 (filterContext.HttpContext.Request.IsAjaxRequest()) 不能识别它是 ajax,这是我的示例代码。

App.js

Var 头 = { “ X- 请求-与”: “ XMLHttpRequest”, “ RequestVerificationToken”: ‘ Content-Type’: ‘ application/json; charset = utf-8;’ } ;

$http ({ 方法: BaseURL + ‘ Save/User’, Data: JSON.stringify ($scope.formData) , 标题: 标题 })然后(函数(值){ 警报(values.data) ; }) catch (function (err){ Log (err.data) ; }) ;


保存控制器

[ HttpPost ] [ MyValidateAntiForgeryToken ] Public ActionResult 用户(UserModel 用户模型) { ....

因为这是第一次搜索:

我只是在 Internet Explorer 中遇到了这个问题,不知道问题出在哪里。长话短说,它没有保存令牌的 cookie 部分,因为我们的(子)域中有一个下划线。可以在 Chrome 中工作,但是 IE/Edge 不喜欢。

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

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

这里的所有其他答案也都是有效的,但是如果它们都没有解决问题,那么也值得检查实际的头是否被传递到服务器。

例如,在 nginx 后面的负载均衡环境中,默认配置是在将请求传递到服务器之前使用 去掉 _ _ RequestVerificationToken 标头,请参见: 简单的 nginx 反向代理似乎去掉了一些头

在我的例子中,是由于在 webconfig 中将 requireSSL=true添加到 httpcookies,使得 AntiForgeryToken 停止工作。例如:

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

为了使 requireSSL=true@Html.AntiForgeryToken()都能正常工作,我在 Global.asaxApplication_BeginRequest中添加了这一行

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

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

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

在我的案例中,我是在发布 AJAX 帖子时得到这个错误的,结果是 __RequestVerificationToken值没有在调用中传递。我必须手动找到这个字段的值,并将其设置为发送到端点的数据对象的属性。

也就是说。

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

例子

超文本标示语言

  <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)
{
...
}

得到这个错误,在 Chrome 默认登录 ASP.NET 与个人用户帐户

. 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

我已经用这种方法解决了

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

并将 System.Web.Helpers.AntiForgery.Validate(cookie != null ? cookie.Value : null, formToken)置于

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

如果您想在一个方法上使用[ ValidateAntiForgeryToken ] ,只需要添加@Html。使用上述方法的表单的 AntiForgeryToken ()。

如果方法的名称与视图相同(视图的表单为@Html。AntiForgeryToken () ,那么控制器中应该有两个重载方法。

就像这样:

首先-> 用于视图的 ActionResult

[AllowAnonymous]
public ActionResult PasswordChange()
{
PasswordChangeViewModel passwordChangeViewModel = new PasswordChangeViewModel();
return View(passwordChangeViewModel);
}

Second-> for HttpPost 方法

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult PasswordChange(PasswordChangeViewModel passwordChangeViewModel)
{
//some code
}