ASP.NET MVC Проверка ViewState MAC не удалась

После публикации новой сборки моего веб-приложения ASP.NET MVC я часто вижу это исключение при просмотре сайта:

System.Web.Mvc.HttpAntiForgeryException: необходимый токен защиты от подделки не был предоставлен или был недействительным. ---> System.Web.HttpException: проверка MAC состояния представления завершилась неудачно. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан один и тот же ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере. ---> System.Web.UI.ViewStateException: недопустимое состояние представления.

Это исключение будет повторяться на каждой странице, которую я посещаю в своем веб-приложении, до тех пор, пока я не закрою Firefox. После повторного открытия Firefox сайт работает отлично. Есть идеи, что происходит?

Дополнительные примечания:

  1. Я не использую веб-элементы управления ASP.NET (в моем приложении нет экземпляров runat="server")
  2. Если я удалю <% = 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 это исправит. Я использовал этот инструмент для быстрой генерации ключа, поэтому я не вижу этих ошибок при разработке, а затем я генерирую его правильно, когда сайт запускается в работу.

http://aspnetresources.com/tools/machineKey

Другие вопросы по тегам