我正在使用Membership.create
用户功能,然后发生以下错误,
所需的防伪表单字段“__RequestVerificationToken”不存在
我怎样才能解决这个问题?
我正在使用Membership.create
用户功能,然后发生以下错误,
所需的防伪表单字段“__RequestVerificationToken”不存在
我怎样才能解决这个问题?
在你的行动之前你有[ValidateAntiForgeryToken]
属性。您还应该@Html.AntiForgeryToken()
在表格中添加。
就我而言,我的 web.config 中有这个:
<httpCookies requireSSL="true" />
但是我的项目设置为不使用 SSL。注释掉该行或将项目设置为始终使用 SSL 解决了它。
像这样:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
还要确保避免在 [HttpGet] 下使用 [ValidateAntiForgeryToken]。
[HttpGet]
public ActionResult MethodName()
{
..
}
即使未启用 Cookie,您也会收到错误消息。
可能导致这种情况(刚刚遇到这种情况)的另一件事如下:如果您出于某种原因禁用表单中的所有输入字段。它将禁用包含您的验证令牌的隐藏输入字段。当表单将被发回时,令牌值将丢失,并将生成丢失的错误。所以你需要做的是重新启用保存验证令牌的输入字段,一切都会好起来的。
我们这些人上传文件作为请求的一部分的另一种可能性。如果内容长度超出<httpRuntime maxRequestLength="size in kilo bytes" />
并且您正在使用请求验证令牌,则浏览器会显示'The required anti-forgery form field "__RequestVerificationToken" is not present'
消息而不是超出请求长度消息。
将 maxRequestLength 设置为足以满足请求的值可以解决眼前的问题——尽管我承认这不是一个合适的解决方案(我们希望用户知道文件大小的真正问题,而不是请求验证令牌丢失的问题)。
就我而言,我在提交表单上有这个 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);
});
...而且效果很好。
确保在您的控制器中具有 http 属性,例如:
[HttpPost]
还要在控制器中添加属性:
[ValidateAntiForgeryToken]
在您的视图中,您必须写下:
@Html.AntiForgeryToken();
我有 Html.AntiForgeryToken(); 如果在代码块中没有 @ 符号,它在 Razor 中不会出错,但在运行时会出错。确保查看@Html.Ant.. 的@ 符号是否缺失
在我的情况下,这是由于添加requireSSL=true
到httpcookies
webconfig 导致 AntiForgeryToken 停止工作。例子:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
为了使两者都能requireSSL=true
工作,我在in 中@Html.AntiForgeryToken()
添加了这一行Application_BeginRequest
Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
如果有人因为我遇到的相同原因遇到错误,这是我的解决方案:
如果你有Html.AntiForgeryToken();
将其更改为@Html.AntiForgeryToken()
在我的情况下,web.config 中用于 cookie 的域不正确是原因:
<httpCookies domain=".wrong.domain.com" />
使用个人用户帐户的 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)
通过清除站点的站点数据来解决:
这里的所有其他答案也是有效的,但如果它们都不能解决问题,那么检查实际的标头是否正在传递给服务器也是值得的。
例如,在 nginx 背后的负载均衡环境中,默认配置是在将请求传递到服务器之前剥离 __RequestVerificationToken 标头,请参阅: simple nginx reverse proxy似乎会剥离一些标头
如果您想在某个方法上使用 [ValidateAntiForgeryToken],您只需将 @Html.AntiForgeryToken() 添加到使用上述方法的表单中。
如果您有与 View 同名的方法(其形式为 @Html.AntiForgeryToken() ),那么您应该在控制器中有两个重载方法。
像这样的东西:
First-> 用于视图的 ActionResult
[AllowAnonymous]
public ActionResult PasswordChange()
{
PasswordChangeViewModel passwordChangeViewModel = new PasswordChangeViewModel();
return View(passwordChangeViewModel);
}
第二-> 用于 HttpPost 方法
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult PasswordChange(PasswordChangeViewModel passwordChangeViewModel)
{
//some code
}
我想分享我的,我一直在使用带有 angularjs 的 asp.net mvc 4 遵循这个anti forgerytoken 教程
,但是每次我使用 $http.post 请求时它都会引发异常,我发现解决方案只是添加
'X- Requested-With': 'XMLHttpRequest'到 $http.post 的标头,因为它似乎(filterContext.HttpContext.Request.IsAjaxRequest())
无法将其识别为 ajax,这是我的示例代码。
应用程序.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)
{
....
因为这是第一次搜索这个:
我只在 Internet Explorer 中遇到过这个问题,无法弄清楚问题所在。长话短说,它没有保存令牌的 cookie 部分,因为我们的(子)域中有一个下划线。在 Chrome 中工作,但 IE/Edge 不喜欢它。
有时您正在编写带有结果列表的表单操作方法。在这种情况下,您不能使用一种操作方法。所以你必须有两个同名的动作方法。一个有属性[HttpGet]
,另一个有[HttpPost]
属性。
在您的[HttpPost]
操作方法中,设置[ValidateAntiForgeryToken]
属性并放入@Html.AntiForgeryToken()
您的 html 表单。
在我的几个控制器上的 EPiServer 解决方案中,索引操作上有一个 ContentOutputCache 属性,它接受了 HttpGet。这些操作的每个视图都包含一个表单,该表单将 HttpPost 操作发布到同一控制器或不同控制器。一旦我从所有这些索引操作中删除该属性,问题就消失了。
我已经这样解决了
[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);
}
就我而言,我在发布 AJAX 帖子时遇到了这个错误,结果证明该__RequestVerificationToken
值没有在调用中传递。我必须手动查找该字段的值并将其设置为发送到端点的数据对象的属性。
IE
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)
{
...
}