我的网站是提出这个例外一天约20次,通常形式的工作正常,但也有这样的情况下,这个问题发生,我不知道为什么是如此随机。
这是elmah记录的异常
500 HttpAntiForgery所需的防伪cookie__RequestVerificationToken "不存在。
但是它发送的形式是elmah在XML日志中显示的令牌
<form>
<item name="__RequestVerificationToken">
<value string="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41"/>
</item>
<item name="toPhone">
<value string="XXXXXX"/>
</item>
<item name="smsMessage">
<value string="xxxxxxxx"/>
</item>
</form>
这是我在控制器上的方法,它使用数据属性来检查令牌是否有效
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<JsonResult> Send(SMSModel model)
{
// my code goes here
}
这是我在视图上的表格
@using (Html.BeginForm("Send", "SMS", FormMethod.Post, new { @class = "form-sms", autocomplete = "off" }))
{
@Html.AntiForgeryToken()
<div class="row">
<div class="col-md-12">
<div class="form-group">
<div class="input-group">
<div class="input-group-addon">+53</div>
@Html.TextBoxFor(m => m.toPhone, new { @class = "form-control", placeholder = "teléfono", required = "required", type = "tel", maxlength = 8 })
</div>
</div>
</div>
</div>
<div class="form-group" style="position:relative">
<label class="sr-only" for="exampleInputEmail3">Message (up to 135 characters)</label>
@Html.TextAreaFor(m => m.smsMessage, new { rows = 4, @class = "form-control", placeholder = "escriba aquí su mensaje", required = "required", maxlength = "135" })
<span class="char-count">135</span>
</div>
if (ViewBag.Sent == true)
{
<div class="alert alert-success alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>Su mensaje ha sido enviado <span class="hidden-xs">satisfactoriamente</span></strong>
</div>
}
if (ViewBag.Error == true)
{
<div class="alert alert-danger alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
<strong>Error:</strong> Por favor revise el número de teléfono.
</div>
}
<div class="errorToMany"></div>
<button type="submit" class="btn btn-default btn-block">Enviar SMS</button>
}
这就是我使用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上检查了其他问题,但没有什么对我有用。
关于我如何发布数据的进一步说明。
此发送SMS的表单具有ToNumber和Message字段。当用户单击提交按钮时,AJAX函数将控制并将其序列化表单的字段数据,当控制器中的函数完成并返回表示一切正常的JSON结果时,AJAX方法重新加载页面,向用户显示成功消息。
任何可能导致此问题的想法。
9条答案
按热度按时间n1bvdmb61#
听起来事情似乎在按预期进行。
防伪造助手
@Html.AntiForgeryToken()
的工作方式是通过将一个名为__RequestVerificationToken
的隐藏表单字段注入到页面中,并在浏览器中设置cookie。当表单被回发时,将比较两者,如果它们不匹配或缺少cookie,则抛出错误。
因此,Elmah记录表单发送
__RequestVerificationToken
并不重要。即使在CSRF
攻击的情况下,它也总是如此,因为这只是隐藏的表单字段。另一方面,错误消息说相应的
COOKIE
没有被发送:500 HttpAntiForgery所需的防伪cookie __RequestVerificationToken”不存在。
所以基本上某人/某物正在重播表单帖子,而没有发出原始请求来获取cookie。因此,他们有隐藏的表单字段
__RequestVerificationToken
,但没有cookie来验证它。所以看起来一切都在正常运转。检查您的日志:IP号码和推荐人等。在重定向表单内容时,您可能会受到攻击,或者可能会做一些奇怪或错误的事情。如上所述,
referrers
是处理这类错误的好地方,假设这不是欺骗。还请注意,根据MDN
reload()方法从当前URL重新加载资源。它的可选唯一参数是一个布尔值,当该参数为true时,将导致始终从服务器重新加载页面。如果为false或未指定,浏览器可能会从缓存中重新加载页面。
如果是这样的话,有时从缓存加载,那么您最终可能会得到一个
POST
,它有旧的页面令牌,但没有cookie。试着:
epggiuax2#
最近遇到了类似的问题。防伪饼干确实不见了,所以(正如其他人指出的)
1.服务器没有添加要请求的cookie,或者
1.浏览器拒绝了它。
在我的例子中,它是服务器:我没有在本地环境中使用SSL,但在
web.config
中我有以下行:在这种情况下,解决方案是切换到SSL,或者保持本地环境的值设置为“False”。
js5cn81o3#
除了rism出色的回答之外,遇到此错误的另一个可能原因是您的浏览器或浏览器插件阻止设置cookie。
lb3vh1jj4#
我在Edge浏览器中遇到了同样的问题。
我已经通过更改浏览器设置解决了这个问题。
按照说明解决问题:
进入设置>查看高级设置> Cookie>更改为“不阻止Cookie”。
关闭浏览器并检查。
我想,这可能会帮助到别人。
lg40wkob5#
不妨看看这个问题。The anti-forgery cookie token and form field token do not match in MVC 4
这可能是超时问题。基本上,当超时发生时,cookie不会被存储,因为运行站点的iis用户没有适当的访问权限。对我来说,我改变了应用程序池来加载用户配置文件,这似乎解决了它。
n3ipq98p6#
检查您是否在前端@Html.AntiForgeryToken()中遗漏了这一行
o75abkj47#
在我的例子中,它与IIS上的缓存有关。我不得不在服务器管理器中重新启动整个IIS服务器。
8fq7wneg8#
将@Html.AntiForgeryToken()放入表单中
tuwxkamq9#
尝试以上解决方案,仍然存在错误。经过进一步检查,这是由于我使用的浏览器设置。
请勿使用下面突出显示的选项。这会导致cookie无法存储。你得到错误的原因。