Ответ 1
В последнее время у меня было и несколько проблем с ValidateAntiForgeryToken
, поэтому я поделился своими выводами с вами.
Соль. Поскольку вы упоминаете, что это происходит только на одной странице, я полагаю, что вы используете разные значения salt
в своих вызовах для вызовов Html.AntiForgeryToken(salt)
и ValidateAntiForgeryToken(salt)
.
AJAX: как сказал другой ответ, использование AJAX может потребовать дополнительной работы, чтобы гарантировать, что токен включен в POST. Вот мое любимое простое, автоматическое решение для добавления маркера во все запросы AJAX POST. В вашем вопросе, однако, вы заявляете, что вы подтвердили, что маркер отправляет. Вы подтвердили, что вы только отправляете токен один раз? Я узнал, что мой AJAX-код дважды посылал токен, который объединял значения и приводил к сбою.
Ключ машины и файлы cookie: эта проблема уродлива, проста в определении (вызывает исключения), но не очень интуитивно понятна. Файлы cookie проверки и токены кодируются и декодируются с использованием уникального "машинного ключа". Это означает, что если у вас есть ферма серверов или смените сервер, ваш файл cookie больше не будет действителен. Закрытие браузера устраняет проблему (поскольку файл cookie - это cookie сеанса). Тем не менее, некоторые люди оставляют свои окна браузера открытыми в фоновом режиме в течение длительного времени!
Решение заключается в установке "машинного ключа" в вашем файле конфигурации. Это позволит MVC использовать один и тот же ключ на всех серверах, гарантируя, что файл cookie будет дешифруемым везде.
Ошибки кодирования: с помощью утилиты тестирования jMeter мы попытались загрузить тестовые страницы, только чтобы узнать, что у нее была ошибка, из-за которой у нашего токена было 2 дополнительных "
значение.
Решение заключается в том, чтобы снизить доверие к вашим инструментам! Тестируйте в браузере, и если это работает, создайте тест, который извлекает значения токена и файла cookie и устанавливает контрольную точку для проверки результатов.
Если ни одна из этих вещей не работает для вас, я рекомендую взглянуть на исходный код MVC для ValidateAntiForgeryTokenAttribute
, в частности метод OnAuthorization
. Это поможет вам увидеть различные шаги, которые могут привести к отказу. Вы даже можете проверить свою ошибку Exception.StackTrace
, чтобы определить, какая часть неисправна.
В качестве побочного примечания мне очень не нравится реализация ValidateAntiForgeryToken
в MVC, потому что:
- Существует около 5 этапов проверки, которые могут выйти из строя, но есть только одно общее сообщение об ошибке.
- Класс запечатан, поэтому его нельзя расширить с помощью дополнительных функций.
- Метод шифрования является странным - он инициализирует
Page
и создает искусственныйViewState
для шифрования токенов и файлов cookie. Кажется, слишком много.
Итак, я схватил исходный код и создал свой собственный специализированный подкласс, который также оказался очень полезным при отладке его проблем, потому что я мог установить точки останова на методы проверки, и было действительно легко определить, какая проверка шаг был неудачным.