В последнее время у меня было и решено несколько проблем с 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. Кажется излишним.
Итак, я взял исходный код и создал свой собственный специализированный подкласс, который также оказался очень полезным при отладке его проблем, потому что я мог устанавливать контрольные точки для методов проверки, и было действительно легко определить, какая проверка шаг не удался.