Answers:
[ValidateAntiForgeryToken]
在执行操作之前,您具有属性。您还应该@Html.AntiForgeryToken()
在表格中添加。
Html.AntiForgeryToken();
不起作用!变成@Html.AntiForgeryToken()
作品
就我而言,我的web.config中包含以下内容:
<httpCookies requireSSL="true" />
但是我的项目设置为不使用SSL。注释掉该行或将项目设置为始终使用SSL即可解决该问题。
IIS
存在此绑定(https » EmptyHostName » IP » 443
),但没有针对(https » www.mysite.com » IP » 443
)的绑定。所以我增加了一个新的具有约束力的非空主机名的https
,这是等于域和它解决了这个问题。我也要IIS
强制重写设置http 2 https
。
像这样:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult MethodName(FormCollection formCollection)
{
...
Code Block
...
}
@using(Html.BeginForm())
{
@Html.AntiForgeryToken()
<input name="..." type="text" />
// rest
}
即使未启用Cookies,您也会收到错误消息。
对于我们中的一些人来说,作为请求的一部分上传文件的另一种可能性。如果内容长度超出限制,<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);
});
...而且效果很好。
readonly
并排除了隐藏的控件。似乎工作得很好。
在我的情况下,cookie的web.config中的域不正确是原因:
<httpCookies domain=".wrong.domain.com" />
在我的情况下,这是由于添加requireSSL=true
到httpcookies
webconfig中导致AntiForgeryToken停止工作。例:
<system.web>
<httpCookies httpOnlyCookies="true" requireSSL="true"/>
</system.web>
为了使双方requireSSL=true
和@Html.AntiForgeryToken()
工作,我加入这一行里面Application_BeginRequest
的Global.asax
protected void Application_BeginRequest(object sender, EventArgs e)
{
AntiForgeryConfig.RequireSsl = HttpContext.Current.Request.IsSecureConnection;
}
在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)
通过清除站点的站点数据来解决:
在我的几个控制器上的EPiServer解决方案中,Index动作的ContentOutputCache属性接受了HttpGet。这些操作的每个视图都包含一个表单,该表单已张贴到HttpPost动作中,该表单也发送到同一控制器或其他控制器。一旦我从所有这些索引操作中删除了该属性,问题就消失了。
此处的所有其他答案也都有效,但是如果它们都不能解决问题,则还应检查是否将实际的标头传递给服务器。
例如,在nginx后面的负载平衡环境中,默认配置是在将请求传递到服务器之前剥离__RequestVerificationToken标头,请参阅:简单的nginx反向代理似乎剥离了一些标头
有时您正在编写带有结果列表的表单操作方法。在这种情况下,您不能使用一种操作方法。因此,您必须具有相同名称的两个操作方法。一个与[HttpGet]
另一个具有[HttpPost]
属性。
在您的[HttpPost]
操作方法中,设置[ValidateAntiForgeryToken]
属性并放入@Html.AntiForgeryToken()
html表单中。
在我的情况下,我在发布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)
{
...
}
public class MyDto { public bool Whatever { get; set; } }
我想分享我的经验,我一直在
使用这个使用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)
{
....