Необходимого анти-подделки cookie "RequestVerificationToken" нет

мой сайт поднимает это исключение около 20 раз в день, обычно форма работает нормально, но есть случаи, когда эта проблема возникает, и я не знаю, почему это так случайно.

это зарегистрированное исключение elmah

500 HttpAntiForgery требуемый анти-подделка cookie __RequestVerificationToken " отсутствует.

но форма, в которой он отправляет токен, как показано в XML-журнале elmah

<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>

Это мой метод на контроллере, который использует атрибут data, чтобы проверить, является ли токен допустимым или nor

[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;
});

форма работает хорошо в большинстве случаев, но эта ошибка продолжает происходить, и я не знаю, почему, я проверил другие вопросы здесь о переполнении стека, но ничего не работает для меня.

для дальнейшего объяснения того, как я публикую данные.

эта форма для отправки SMS есть поля ToNumber и Message. Когда пользователь нажимает на кнопку отправки, функция AJAX берет управление и публикует его, сериализуя данные поля формы, когда моя функция в контроллере заканчивается и возвращает результат JSON, указывающий, что все прошло хорошо, метод AJAX перезагружает страницу, показывающую пользователю сообщение об успехе.

любые идеи, что может быть причиной этой проблемы.

5 ответов


это почти звучит так, как будто все работает, как ожидалось.

путь анти-подделки помощник @Html.AntiForgeryToken() работает путем инъекции скрытого поля формы с именем __RequestVerificationToken на страницу, а также устанавливает cookie в браузере.

когда форма отправляется обратно, сравниваются два, и если они не совпадают или файл cookie отсутствует, возникает ошибка.

поэтому не имеет значения, что elmah регистрирует, что форма отправляет __RequestVerificationToken. Так будет всегда., даже в случае CSRF атаки, потому что это просто скрытое поле формы.

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

сообщение об ошибке, с другой стороны говорит тегом COOKIE не отправляется:

500 HttpAntiForgery необходимые анти-подделки печенья __RequestVerificationToken " нет.

таким образом, в основном кто-то / что-то воспроизводит сообщение формы без первоначального запроса на получение cookie. Как таковые, они имеют скрытое поле формы __RequestVerificationToken но не cookie, чтобы проверить это.

похоже, что все работает так, как должно. Проверьте свои журналы re: IP-номера и рефереры и т. д. Вы можете быть под атакой или, возможно, делать что-то странное или багги при перенаправлении содержимого формы. Как и выше,referrers являются хорошим местом для начала такого рода ошибок, предполагая, что это не подделывается.

также обратите внимание, что согласно MDN

location.reload();

Расположение.метод reload () перезагружает ресурс из текущего URL-АДРЕС. Его необязательным уникальным параметром является логическое значение, которое true, заставляет страницу всегда перезагружаться с сервера. Если это false или не указано, браузер может перезагрузить страницу кэш.

если это так, иногда загрузка из кэша, то вы можете получить POST что есть старый маркер страницы, но не файлы cookie.

так попробовать :

location.reload(true);

недавно столкнулся с подобной проблеме. Анти-подделка cookie действительно отсутствовала, так что (как указывали другие) либо

  1. сервер не добавил cookie для запроса или
  2. браузер отклонил его.

в моем случае это был сервер: я не использовал SSL в локальной среде, но в web.config У меня была следующая строка:

<httpCookies requireSSL="True"/>

решение в этом случае-либо переключиться на SSL, либо сохранить значение "False" для местная окружающая среда.


в дополнение к превосходному ответу рисм, еще одна возможная причина для возникновения этой ошибки заключается в том, что Ваш браузер или плагин браузера блокирует куки от установки.


У меня была такая же проблема в браузере Edge.

я исправил эту проблему, изменив настройки браузера.

следуйте инструкциям, чтобы исправить проблему:

перейдите в Настройки > просмотреть дополнительные настройки > Cookies > изменить на "не блокировать cookies".

закройте браузер и проверьте.

Я подумал, что это может кому-то помочь.


возможно, захотите взглянуть на этот вопрос. маркер cookie анти-подделки и маркер поля формы не совпадают в MVC 4

возможно, что это проблема тайм-аута. В основном, когда тайм-аут происходит, cookie не сохраняется, потому что пользователь iis, под которым работает сайт, не имеет надлежащего доступа. Для меня я изменил пул приложений для загрузки профиля пользователя,и это, казалось, исправить.