Ошибка ASP.NET MVC проверки MAC-адреса ViewState
После публикации новой сборки моего веб-приложения ASP.NET MVC я часто вижу это исключение, которое вызывается при просмотре на сайт:
System.Web.Mvc.HttpAntiForgeryException: Требуемый токен анти-подделки не был указан или был недействителен. --- > System.Web.HttpException: Не удалось выполнить проверку MAC-адреса viewstate. Если это приложение размещено веб-фермой или кластером, убедитесь, что в конфигурации указан тот же алгоритм validationKey и validation. AutoGenerate не может использоваться в кластере. --- > System.Web.UI.ViewStateException: недопустимое состояние просмотра.
Это исключение будет продолжаться на каждой странице, которую я посещаю в своем веб-приложении, пока я не закрою Firefox. После повторного открытия Firefox сайт работает отлично. Любая идея, что происходит?
Дополнительные примечания:
- Я не использую никаких веб-элементов управления ASP.NET(в моем приложении нет экземпляров runat = "server" )
- Если я вытащил <% = Html.AntiForgeryToken% > с моих страниц, эта проблема, похоже, исчезнет.
Ответы
Ответ 1
Под обложками атрибут 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"
/>
...
Ответ 2
Если вы находитесь на ферме серверов, убедитесь, что ваш машинный ключ на каждом сервере одинаков.
Ответ 3
У меня тоже была эта проблема, и ожидая, что пользователи очистят свой кеш, куки или обновят страницу, неприемлемо.
Добавление машинного ключа в web.config будет исправлено. Я использовал этот инструмент для быстрого создания ключа, поэтому я не вижу этих ошибок в разработке, а затем создаю его правильно, когда сайт переходит в производство.
http://aspnetresources.com/tools/machineKey