簡體   English   中英

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

[英]The required anti-forgery cookie "__RequestVerificationToken" is not present

我的網站每天大約 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 方法會重新加載頁面,顯示用戶成功信息。

任何可能導致此問題的想法。

聽起來好像事情按預期進行。

防偽助手@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();

Location.reload() 方法從當前 URL 重新加載資源。 它的可選唯一參數是一個布爾值,當它為真時,會導致頁面始終從服務器重新加載。 如果為 false 或未指定,瀏覽器可能會從其緩存中重新加載頁面

如果是,有時從緩存加載,那么您最終可能會得到一個具有舊頁面令牌但沒有 cookie 的POST

所以嘗試:

location.reload(true);

最近遇到了類似的問題。 防偽 cookie 確實丟失了,所以(正如其他人指出的那樣)要么

  1. 服務器沒有將 cookie 添加到請求中,或者
  2. 瀏覽器拒絕了它。

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

<httpCookies requireSSL="True"/>

在這種情況下,解決方案是切換到 SSL,或者將本地環境的值設置為“False”。

除了 rism 的出色回答之外,遇到此錯誤的另一個可能原因是您的瀏覽器或瀏覽器插件正在阻止設置 cookie

我在邊緣瀏覽器中遇到了同樣的問題。

我通過更改瀏覽器設置解決了這個問題。

按照說明解決問題:

轉至設置 > 查看高級設置 > Cookie > 更改為“不阻止 Cookie”。

關閉瀏覽器並檢查。

我想,它可能會幫助某人。

檢查您是否錯過了前端 @Html.AntiForgeryToken() 中的這一行

可能想看看這個問題。 防偽 cookie 令牌和表單字段令牌在 MVC 4 中不匹配

這可能是超時問題。 基本上,當超時發生時,cookie 不會被存儲,因為運行站點的 iis 用戶沒有正確的訪問權限。 對我來說,我更改了應用程序池以加載用戶配置文件,這似乎解決了它。

就我而言,它與 IIS 上的緩存有關。 我不得不在服務器管理器中重新啟動整個 IIS 服務器。

把 @Html.AntiForgeryToken() 放在你的表單中

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM