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

jutyujz0  于 2023-06-22  发布在  jQuery
关注(0)|答案(9)|浏览(252)

我的网站是提出这个例外一天约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">&times;</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">&times;</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方法重新加载页面,向用户显示成功消息。
任何可能导致此问题的想法。

n1bvdmb6

n1bvdmb61#

听起来事情似乎在按预期进行。
防伪造助手@Html.AntiForgeryToken()的工作方式是通过将一个名为__RequestVerificationToken的隐藏表单字段注入到页面中,并在浏览器中设置cookie。
当表单被回发时,将比较两者,如果它们不匹配或缺少cookie,则抛出错误。
因此,Elmah记录表单发送__RequestVerificationToken并不重要。即使在CSRF攻击的情况下,它也总是如此,因为这只是隐藏的表单字段。

<input name="__RequestVerificationToken" type="hidden" value="DNbDMrzHmy37GPS6IFH-EmcIh4fJ2laezIrIEev5f4vOhsY9T7SkH9-1b7GPjm92CTFtb4dGqSe2SSYrlWSNEQG1MUlNyiLP1wtYli8bIh41" />

另一方面,错误消息说相应的COOKIE没有被发送:
500 HttpAntiForgery所需的防伪cookie __RequestVerificationToken”不存在。
所以基本上某人/某物正在重播表单帖子,而没有发出原始请求来获取cookie。因此,他们有隐藏的表单字段__RequestVerificationToken,但没有cookie来验证它。
所以看起来一切都在正常运转。检查您的日志:IP号码和推荐人等。在重定向表单内容时,您可能会受到攻击,或者可能会做一些奇怪或错误的事情。如上所述,referrers是处理这类错误的好地方,假设这不是欺骗。
还请注意,根据MDN

location.reload();

reload()方法从当前URL重新加载资源。它的可选唯一参数是一个布尔值,当该参数为true时,将导致始终从服务器重新加载页面。如果为false或未指定,浏览器可能会从缓存中重新加载页面
如果是这样的话,有时从缓存加载,那么您最终可能会得到一个POST,它有旧的页面令牌,但没有cookie。
试着:

location.reload(true);
epggiuax

epggiuax2#

最近遇到了类似的问题。防伪饼干确实不见了,所以(正如其他人指出的)
1.服务器没有添加要请求的cookie,或者
1.浏览器拒绝了它。
在我的例子中,它是服务器:我没有在本地环境中使用SSL,但在web.config中我有以下行:

<httpCookies requireSSL="True"/>

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

js5cn81o

js5cn81o3#

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

lb3vh1jj

lb3vh1jj4#

我在Edge浏览器中遇到了同样的问题。
我已经通过更改浏览器设置解决了这个问题。
按照说明解决问题:
进入设置>查看高级设置> Cookie>更改为“不阻止Cookie”。
关闭浏览器并检查。
我想,这可能会帮助到别人。

lg40wkob

lg40wkob5#

不妨看看这个问题。The anti-forgery cookie token and form field token do not match in MVC 4
这可能是超时问题。基本上,当超时发生时,cookie不会被存储,因为运行站点的iis用户没有适当的访问权限。对我来说,我改变了应用程序池来加载用户配置文件,这似乎解决了它。

n3ipq98p

n3ipq98p6#

检查您是否在前端@Html.AntiForgeryToken()中遗漏了这一行

o75abkj4

o75abkj47#

在我的例子中,它与IIS上的缓存有关。我不得不在服务器管理器中重新启动整个IIS服务器。

8fq7wneg

8fq7wneg8#

将@Html.AntiForgeryToken()放入表单中

tuwxkamq

tuwxkamq9#

尝试以上解决方案,仍然存在错误。经过进一步检查,这是由于我使用的浏览器设置。
请勿使用下面突出显示的选项。这会导致cookie无法存储。你得到错误的原因。

相关问题