Отсутствует обязательный файл cookie requestverificationtoken для защиты от подделки

Обновлено: 07.07.2024

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

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

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

Это моя форма на просмотре

И вот как я публикую свои данные с помощью AJAX

Форма работает нормально большую часть времени, но эта ошибка повторяется, и я не знаю почему. Я проверил другие вопросы здесь, в Stack Overflow, но у меня ничего не работает.

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

Любые идеи, что может вызвать эту проблему.

Похоже, что все работает так, как ожидалось.

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

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

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

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

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

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

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

В моем случае это было связано с кешированием в IIS. Мне пришлось перезапустить весь сервер IIS в диспетчере серверов.

Поместите @ Html.AntiForgeryToken () внутрь вашей формы

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

Проверьте, не пропустите ли вы эту строку в своем интерфейсе @ Html.AntiForgeryToken () или нет

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

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

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

Выберите «Настройки»> «Просмотр дополнительных настроек»> «Файлы cookie»> «Не блокировать файлы cookie».

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

Подумал, может кому-то поможет.

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

Недавно столкнулся с подобной проблемой. Файл cookie для защиты от подделки действительно отсутствовал, поэтому (как указывали другие) либо

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

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

Решение в этом случае - либо перейти на SSL, либо оставить значение «False» для локальной среды.

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

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

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

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

Это моя форма на вид

и вот как я публикую свои данные с помощью AJAX

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

У вас есть атрибут [ValidateAntiForgeryToken] перед действием. Вы также должны добавить @Html.AntiForgeryToken() в свою форму.

В моем случае у меня было это в моем web.config:

Но мой проект был настроен не на использование SSL. Комментируя эту строку или настраивая проект, чтобы всегда использовать SSL, он решил.

Контроллер

Другая вещь, которая может вызвать это (просто натолкнулась на это), следующая: если вы по какой-то причине отключите все свои поля ввода в своей форме. он отключит скрытое поле ввода, содержащее токен проверки. когда форма будет отправлена ​​обратно, значение токена будет отсутствовать и будет генерировать ошибку, которая отсутствует. поэтому вам нужно снова включить поле ввода, которое содержит токен проверки, и все будет хорошо.

Установка для maxRequestLength значения, достаточно большого, чтобы удовлетворить запрос, устраняет непосредственную проблему - хотя я признаю, что это не правильное решение (мы хотим, чтобы пользователь знал истинную проблему размера файла, а не проблему отсутствующих маркеров проверки запроса).

также добавить атрибут в контроллер:

В вашей форме на ваш взгляд вы должны написать:

У меня был Html.AntiForgeryToken(); без знака @, когда он был в блоке кода, он не выдавал ошибку в Razor, а выполнял во время выполнения. Убедитесь, что вы смотрите на @знак @Html.Ant.. если он отсутствует или не

В моем случае у меня был этот javascript в форме отправки:

Это удаляло скрытый RequestVerificationToken из отправляемой формы. Я изменил это на:

. и все работало нормально.

Если кто-то испытывает ошибку по той же причине, почему я ее испытываю, вот мое решение:

если у вас есть Html.AntiForgeryToken();

измените его на @Html.AntiForgeryToken()

В моем случае неправильный домен в web.config для файлов cookie был причиной:

Чтобы обе функции requireSSL=true и @Html.AntiForgeryToken() работали, я добавил эту строку внутри Application_BeginRequest в Global.asax

Потому что это связано с первым поиском этого:

У меня была эта проблема только в Internet Explorer и я не мог понять, в чем проблема. Короче говоря, это не спасло часть cookie Token, потому что наш (под) домен имел в ней символ подчеркивания. Работал в Chrome, но IE/Edge не понравилось.


Я использую пользовательскую функцию , тогда возникает следующая ошибка:

Отсутствует обязательное поле формы защиты от подделки "__RequestVerificationToken"

Перед действием у вас есть атрибут . Вы также должны добавить в свою форму .

В моем случае это было в моем web.config:

Но мой проект был настроен не использовать SSL. Комментирование этой строки или настройка проекта на постоянное использование SSL решила эту проблему.

Контроллер

  • 2 Хорошее попадание. Я использовал Internet Explorer. Использование браузера Chrome решило проблему для меня
  • Это тоже решило мою проблему. включение файлов cookie в Google Chrome. Спасибо

Еще одна вещь, которая может вызвать это (только что столкнулась с этим), заключается в следующем: если вы по какой-то причине отключите все поля ввода в своей форме. он отключит скрытое поле ввода, содержащее ваш токен подтверждения. когда форма будет отправлена ​​обратно, значение токена будет отсутствовать и вызовет ошибку, которая отсутствует. поэтому вам нужно снова включить поле ввода, содержащее токен проверки, и все будет хорошо.

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

В моем случае у меня был этот javascript в форме submit:

Это удаляло скрытый RequestVerificationToken из отправляемой формы. Я изменил это на:

. и все работало нормально.

  • Как вы заметили, что антиклавиша влияет при отключении ввода?
  • 1 @Cer - если вы спрашиваете, как я заметил, я проверил запрос со скрипачом и понял, что ключ не отправляется. Я читал, что отправленные HTML-файлы не будут включать отключенные элементы управления. Поэтому я изменил его на и исключил скрытые элементы управления. Кажется, хорошо работает.

также добавьте атрибут в контроллер:

В вашей форме на ваш взгляд вы должны написать:

У меня был Html.AntiForgeryToken (); без знака @, когда он был в блоке кода, он не выдавал ошибки в Razor, но выдавал во время выполнения. Убедитесь, что вы смотрите на знак @ в @ Html.Ant . если он отсутствует или нет

Если у кого-то возникает ошибка по той же причине, по которой я ее испытываю, вот мое решение:

если бы у вас было

измените его на

В моем случае причиной был неправильный домен в web.config для файлов cookie:

  • да! если вы на локальном компьютере типа тогда файлы cookie будут работать только на локальном компьютере, и если вы попытаетесь открыть свой сайт на другом компьютере, вы введете его IP (например, 192.168.1.43), который не будет работать, потому что он ищет "localhost"

В моем случае это произошло из-за добавления к в webconfig, в результате чего AntiForgeryToken перестал работать. Пример:

Чтобы заставить работать как , так и , я добавил эту строку внутри в

Решается очисткой данных сайта для сайта:


Потому что это происходит при первом поиске этого:

У меня была эта проблема только в Internet Explorer, и я не мог понять, в чем проблема. Короче говоря, он не сохранял часть маркера cookie, потому что в нашем (под) домене был знак подчеркивания. Работал в Chrome, но IE / Edge не нравился.

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

Например, в среде с балансировкой нагрузки за nginx конфигурация по умолчанию: вырезать заголовок __RequestVerificationToken перед передачей запроса на сервер см .: простой обратный прокси-сервер nginx, похоже, удаляет некоторые заголовки

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

В методе действия установите атрибут , а также поместите в свою html-форму.

Читайте также: