Токен защиты от подделки ASP.MVC и криптографические ошибки
-
12-09-2019 - |
Вопрос
Я использую ELMAH для обработки ошибок на своих сайтах MVC и за последние пару недель заметил, что у меня возникают некоторые исключения CryptographicExceptions.Сообщение следующее:
System.Security.Cryptography.CryptographicException:Заполнение недопустимо и не может быть удалено.
System.Web.Mvc.HttpAntiForgeryException:Требуемый токен анти-форуги не был поставлен или был недействительным.---> system.web.httpexception:Проверка ViewState Mac не удалась.Если это приложение размещено в веб -ферме или кластере, убедитесь, что конфигурация указывает тот же алгоритм проверки и валидации.Аутогенерат не может быть использован в кластере.--->
Приложение не работает в кластере, и я не могу воспроизвести эти ошибки.Они выглядят как действительные запросы, а не как рукописные сообщения, и содержат файл cookie __RequestVerificationToken.У меня есть необходимый HTML-помощник на странице внутри формы (моя форма входа).
У меня пока не было никаких жалоб со стороны пользователей, поэтому я предполагаю, что в конечном итоге это сработает для любого, кто пытается войти в систему, но мне остается только задаваться вопросом, почему это может происходить.
Кто-нибудь еще видит такое поведение или имеет какие-либо идеи о том, как диагностировать исключение - как я уже сказал, я не могу заставить его выйти из строя.Удаление файла cookie в FF приводит к другой ошибке.Изменение файла cookie (изменение или удаление содержимого) также приводит к другой ошибке, как и изменение содержимого скрытого ввода токена на странице.
Решение
Я не уверен, есть ли корреляция, но после добавления файла robots.txt, исключающего мои действия по входу в систему, я больше не вижу этих ошибок.Я подозреваю, что это связано с тем, что сканер заходит на страницу и пытается вызвать действие входа в систему.
РЕДАКТИРОВАТЬ:Я также сталкиваюсь с этой проблемой при получении старых файлов cookie после перезапуска пула приложений.Я прибег к явной настройке машинного ключа, чтобы изменения ключей проверки/дешифрования при перезапуске приложения не влияли на старые файлы cookie, которые могут быть повторно отправлены.
После обновления сайта и перехода на фиксированный компьютерный ключ я обнаружил, что все еще получаю эти ошибки от людей, у которых были файлы cookie из предыдущей версии.В качестве временной меры я добавил следующий обработчик Application_Error:
public void Application_Error()
{
var exception = Server.GetLastError().GetBaseException();
if (exception is System.Security.Cryptography.CryptographicException)
{
Server.ClearError();
if (Request.IsAuthenticated)
{
var form = new FormsAuthenticationWrapper();
form.SignOut();
Session.Clear();
}
Response.Cookies.Clear();
Response.Redirect( "~" );
}
}
Другие советы
Я не уверен, что это имеет какое-то конкретное отношение к системе защиты от подделки, внутреннее исключение гласит: «Проверка MAC-адреса состояния просмотра не удалась». Насколько я могу судить, инфраструктура по умолчанию для системы защиты от подделки зависит от состояния просмотра ( на самом деле, если ты взгляни сюда вы увидите зависимость и ужас (метод CreateFormatterGenerator внизу)).
Что касается того, почему Mac viewstate не справляется с поддельным запросом, я не уверен, но, учитывая ужас, который существует при десериализации токена защиты от подделки (обработка всего поддельного запроса), это меня совсем не удивляет.