所需的防伪cookie“__RequestVerificationToken”不存在

我的网站每天大约20次提出这个exception,通常表单工作正常,但有些情况发生这个问题,我不知道为什么这么随机。

这是elmah记录的exception

500 HttpAntiForgery所需的防伪cookie __RequestVerificationToken“不存在。

但它正在发送由elmah在XML日志中显示的令牌的forms

这是我在控制器上的方法,它使用数据属性来检查令牌是否有效

 [HttpPost] [ValidateAntiForgeryToken] public async Task Send(SMSModel model) { // my code goes here } 

这是我在视图上的表单

 @using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" })) { @Html.AntiForgeryToken() 
+53
@Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 })
@Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" }) 135
if (ViewBag.Sent == true) { } if (ViewBag.Error == true) { }
}

这就是我如何使用AJAX发布我的数据

 $('form.form-sms').submit(function (event) { $.ajax({ url: $(this).attr("action"), type: "POST", data: $(this).serializeArray(), beforeSend: function (xhr) { $('.btn-default').attr("disabled", true); $('.btn-default').html("Enviando...") }, success: function (data, textStatus, jqXHR) { if (data[0] == false && data[1] == "1") { some code } else { location.reload(); } }, error: function (jqXHR, textStatus, errorThrown) { } }); return false; }); 

这个表单大部分时间运行良好,但是这个错误一直在发生,我不知道为什么,我已经在Stack Overflow上检查了其他问题,但对我来说没有任何作用。

有关如何发布数据的进一步说明。

这个发送短信的表格有ToNumber和Message字段。 当用户点击提交按钮时,AJAX函数会控制并发布序列化表单的字段数据,当我在控制器中的函数完成并返回指示一切顺利的JSON结果时,AJAX方法重新加载显示用户成功的页面信息。

可能导致此问题的任何想法。

听起来好像事情按预期工作。

防伪帮助程序@Html.AntiForgeryToken()工作方式是将名为__RequestVerificationToken的隐藏表单字段注入页面,并将cookie设置到浏览器中。

回传表单时,将比较两个表单,如果它们不匹配或cookie丢失,则抛出错误。

所以Elmah记录表单发送__RequestVerificationToken并不重要。 即使在CSRF攻击的情况下,它总是会,因为这只是隐藏的表单字段。

  

另一方面,错误消息表示没有发送相应的COOKIE

500 HttpAntiForgery所需的防伪cookie __RequestVerificationToken“不存在。

所以基本上某人/某事正在重播表格post而没有提出获取cookie的原始请求。 因此,他们有隐藏的表单字段__RequestVerificationToken但不是用于validation它的cookie。

因此看起来事情正如他们应该的那样工作。 检查您的日志:IP号码和推荐人等。重定向表单内容时,您可能受到攻击或者可能正在做一些奇怪或错误的事情。 如上所述, referrers是一个很好的开始这种错误的地方,假设这不是欺骗。

另请注意,根据MDN

 location.reload(); 

Location.reload()方法从当前URL重新加载资源。 它的可选唯一参数是一个布尔值,当它为真时,会导致页面始终从服务器重新加载。 如果为false或未指定, 则浏览器可以从其缓存重新加载页面

如果是,有时从缓存加载,那么您可能最终得到一个具有旧页面令牌而不是cookie的POST

所以尝试:

 location.reload(true); 

除了rism的优秀答案之外,遇到此错误的另一个可能原因是因为您的浏览器或浏览器插件阻止了cookie的设置

最近陷入了类似的问题。 确实缺少防伪cookie,所以(正如其他人指出的那样)

  1. 服务器没有添加cookie来请求,或
  2. 浏览器拒绝了它。

就我而言,它是服务器:我没有在本地环境中使用SSL,但在web.config我有以下行:

  

在这种情况下,解决方案是切换到SSL,或者将值设置为“False”以用于本地环境。

我在边缘浏览器中遇到了同样的问题。

我已通过更改浏览器设置修复了此问题。

按照说明解决问题:

转到设置>查看高级设置> Cookies>更改为“不阻止cookie”。

关闭浏览器并检查。

我想,这可能对某人有所帮助。

可能想看看这个问题。 防伪cookie令牌和表单字段令牌在MVC 4中不匹配

这可能是超时问题。 基本上,当超时发生时,cookie不会被存储,因为运行该站点的iis用户没有正确的访问权限。 对我来说,我更改了应用程序池以加载用户配置文件,这似乎解决了它。