Отсутствует обязательный файл cookie requestverificationtoken для защиты от подделки
мой сайт поднимает это исключение около 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 действительно отсутствовала, так что (как указывали другие) либо
- сервер не добавил cookie для запроса или
- браузер отклонил его.
в моем случае это был сервер: я не использовал SSL в локальной среде, но в web.config У меня была следующая строка:
решение в этом случае-либо переключиться на SSL, либо сохранить значение "False" для местная окружающая среда.
в дополнение к превосходному ответу рисм, еще одна возможная причина для возникновения этой ошибки заключается в том, что Ваш браузер или плагин браузера блокирует куки от установки.
У меня была такая же проблема в браузере Edge.
я исправил эту проблему, изменив настройки браузера.
закройте браузер и проверьте.
Я подумал, что это может кому-то помочь.
My website is raising this exception around 20 times a day, usually the form works fine but there are instances where this issue occur and I don't know why is so random.
This is logged exception by elmah
500 HttpAntiForgery The required anti-forgery cookie __RequestVerificationToken" is not present.
But the form it is sending the the token as shown on the XML log by elmah
This is my method on the controller which uses the data Attribute to check if the token is valid or nor
This is my form on the view
And this how I post my data using AJAX
The form works well most time but this error keeps happening and I don't know why, I've checked other questions here on Stack Overflow but nothing works for me.
For further explanation about how I post the data.
This form to send SMS has the fields ToNumber and Message. When a user clicks on the submit Button the AJAX function takes control and post it serializing the form's field data, when my function in the controller finishes and return the JSON result indicating everything went well, the AJAX method reloads the page showing the user a success message.
Any ideas what could be causing this issue.
The View:
You will receive the error even when Cookies are not enabled.
Another thing that can cause this (just ran into this) is the following: if you for some reason disable all your input fields in your form. it will disable the hidden input field that holds your verification token. when the form will be posted back the token value will be missing and will generate the error that it is missing. so what you need to do is to re-enable the input field that holds the verification token and all will be well.
Another possibility for those of us uploading files as part of the request. If the content length exceeds and you're using request verification tokens, the browser displays the 'The required anti-forgery form field "__RequestVerificationToken" is not present' message instead of the request length exceeded message.
Setting maxRequestLength to a value large enough to cater for the request cures the immediate issue - though I'll admit it's not a proper solution (we want the user to know the true problem of file size, not that of request verification tokens missing).
In my case, I had this javascript on the form submit:
This was removing the hidden RequestVerificationToken from the form being submitted. I changed that to:
. and it worked fine.
@Cer - if you're asking how I noticed, I checked the request with fiddler and picked up that the key was not being sent. The I read that Html submits won't include disabled controls. So I changed it to readonly and excluded the hidden controls. Seems to work nicely.
also add the attribute in the controller:
In your form on your view you have to write:
I had Html.AntiForgeryToken(); without the @ sign while it was in a code block, it didn't give an error in Razor but did at runtime. Make sure you look at the @ sign of @Html.Ant.. if it is missing or not
Мой веб-сайт вызывает это исключение около 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 для защиты от подделки действительно отсутствовал, поэтому (как указывали другие) либо
- сервер не добавил cookie в запрос, или
- браузер отклонил это.
В моем случае это был сервер: я не использовал SSL в локальной среде, но в web.config у меня была следующая строка:
Решение в этом случае - либо перейти на SSL, либо оставить значение «False» для локальной среды.
Я использую пользовательскую функцию Membership.create , то возникает следующая ошибка:
Отсутствует обязательное поле формы защиты от подделки "__RequestVerificationToken".
Перед действием у вас есть атрибут [ValidateAntiForgeryToken] . Вы также должны добавить @Html.AntiForgeryToken() в свою форму.
8 Answers 8
It almost sounds as if things are working as expected.
The way the anti forgery helper @Html.AntiForgeryToken() works is by injecting a hidden form field named __RequestVerificationToken into the page AND it also sets a cookie into the browser.
When the form is posted back the two are compared and if they don't match or the cookie is missing then the error is thrown.
So it does not matter that Elmah logs that the form is sending __RequestVerificationToken . It always will, even in the event of CSRF attack, because this is simply the hidden form field.
The error message on the other hand says the corresponding COOKIE is not being sent:
500 HttpAntiForgery The required anti-forgery cookie __RequestVerificationToken" is not present.
So basically someone/something is replaying the form post without making the original request to get the cookie. As such they have the hidden form field __RequestVerificationToken but NOT the cookie to verify it.
Also note that as per MDN
The Location.reload() method reloads the resource from the current URL. Its optional unique parameter is a Boolean, which, when it is true, causes the page to always be reloaded from the server. If it is false or not specified, the browser may reload the page from its cache.
If it is, on occasion loading from cache, then you might end up with a POST that has the old page token but not the cookie.
You have [ValidateAntiForgeryToken] attribute before your action. You also should add @Html.AntiForgeryToken() in your form.
I have everything ok, in my tests it works, on a client's machine it worked until recently, but now it gives this error. I have no idea why. Does anybody have other ideas than the ones listed here please?
In my case, I had this in my web.config:
But my project was set to not use SSL. Commenting out that line or setting up the project to always use SSL solved it.
Примере
HTML
Javascript
Контроллер
Все остальные ответы здесь также действительны, но если ни один из них не решает проблему, также стоит проверить, что фактические заголовки передаются на сервер.
Например, в среде с балансировкой нагрузки за nginx конфигурация по умолчанию - вырезать заголовок __RequestVerificationToken перед передачей запроса на сервер, см. простой обратный прокси-сервер nginx, похоже, удаляет некоторые заголовки
Потому что это происходит при первом поиске этого:
У меня была эта проблема только в Internet Explorer, и я не мог понять, в чем проблема. Короче говоря, это не сохраняло часть маркера cookie, потому что в нашем (под) домене был знак подчеркивания. Работал в Chrome, но IE / Edge не нравился.
Решается очисткой данных сайта для сайта:
В моем случае причиной был неправильный домен в web.config для файлов cookie:
Чтобы и requireSSL=true , и @Html.AntiForgeryToken() работали, я добавил эту строку внутри Application_BeginRequest в Global.asax
Если у кого-то возникла ошибка по той же причине, по которой она возникла у меня, вот мое решение:
Если бы у вас был Html.AntiForgeryToken();
Измените его на @Html.AntiForgeryToken()
Также добавьте атрибут в контроллер:
В вашей форме на ваш взгляд вы должны написать:
У меня был Html.AntiForgeryToken (); без знака @, когда он был в блоке кода, он не выдавал ошибки в Razor, но выдавал во время выполнения. Убедитесь, что вы смотрите на знак @ в @ Html.Ant . если он отсутствует или нет
В моем случае у меня был этот javascript в форме submit:
Это удаляло скрытый RequestVerificationToken из отправляемой формы. Я изменил это на:
. и все работало нормально.
Установка для maxRequestLength значения, достаточно большого, чтобы удовлетворить запрос, решает непосредственную проблему - хотя я признаю, что это неправильное решение (мы хотим, чтобы пользователь знал истинную проблему размера файла, а не проблему отсутствия токенов проверки запроса).
Еще одна вещь, которая может вызвать это (только что столкнулась с этим), заключается в следующем: если вы по какой-то причине отключите все поля ввода в своей форме. он отключит скрытое поле ввода, содержащее ваш токен подтверждения. когда форма будет отправлена обратно, значение токена будет отсутствовать и будет генерировать ошибку, которая отсутствует. Итак, что вам нужно сделать, это снова включить поле ввода, содержащее токен проверки, и все будет хорошо.
The Controller
Читайте также: