ASP.NET MVC Проверка ViewState MAC не удалась
После публикации новой сборки моего веб-приложения ASP.NET MVC я часто вижу это исключение при просмотре сайта:
System.Web.Mvc.HttpAntiForgeryException: необходимый токен защиты от подделки не был предоставлен или был недействительным. ---> System.Web.HttpException: проверка MAC состояния представления завершилась неудачно. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан один и тот же ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере. ---> System.Web.UI.ViewStateException: недопустимое состояние представления.
Это исключение будет повторяться на каждой странице, которую я посещаю в своем веб-приложении, до тех пор, пока я не закрою Firefox. После повторного открытия Firefox сайт работает отлично. Есть идеи, что происходит?
Дополнительные примечания:
- Я не использую веб-элементы управления ASP.NET (в моем приложении нет экземпляров runat="server")
- Если я удалю <% = Html.AntiForgeryToken%> со своих страниц, эта проблема, похоже, исчезнет
3 ответа
Под прикрытием атрибут MVC AntiForgeryToken использует машинный ключ для шифрования. Если вы не указываете машинный ключ в файле web.config (см. Здесь), он автоматически создается для вас ASP.NET ( полное описание).
Если приложение ASP.NET будет перезапущено (например, выполнить iisreset), AntiForgeryToken в файле cookie браузера будет по-прежнему зашифрован со старым ключом компьютера, поэтому и происходит сбой с указанной выше ошибкой.
Поэтому вы всегда должны указывать машинный ключ в вашем файле web.config при использовании MVC, например
<configuration>
<system.web>
<machineKey
validationKey="21F090935F6E49C2C797F69BBAAD8402ABD2EE0B667A8B44EA7DD4374267A75D7AD972A119482D15A4127461DB1DC347C1A63AE5F1CCFAACFF1B72A7F0A281B"
decryptionKey="ABAA84D7EC4BB56D75D217CECFFB9628809BDB8BF91CFCD64568A145BE59719F"
validation="SHA1"
decryption="AES"
/>
...
Если вы находитесь на ферме серверов, убедитесь, что ваш машинный ключ на каждом сервере одинаков.
У меня тоже была эта проблема, и ожидание, что пользователи очистят свой кеш, файлы cookie или обновят страницу, неприемлемо.
Добавление машинного ключа в web.config это исправит. Я использовал этот инструмент для быстрой генерации ключа, поэтому я не вижу этих ошибок при разработке, а затем я генерирую его правильно, когда сайт запускается в работу.