Не удалось проверить MAC состояния представления, когда на странице более 20 минут - PullRequest
9 голосов
/ 14 января 2011

Если вы открываете веб-страницу на одном из веб-сайтов, размещенных на нашем сервере, оставляете ее на 20 минут и затем отправляете форму, возникает ошибка Validation of viewstate MAC failed..

Какие возможные причины могут быть для этого?

Ответы [ 5 ]

12 голосов
/ 15 января 2011

Есть несколько причин, по которым это может произойти:

Автоматически сгенерированные машинные ключи:

Если для пулов приложений по умолчанию установлено время ожидания по умолчанию, равное 20 минутам, и вы используете автоматически сгенерированные ключи проверки и расшифровки, то при каждом запуске пула он будет генерировать новый набор ключей. Это делает недействительным зашифрованное состояние браузера. Вы также обнаружите, что билеты проверки подлинности форм для постоянных билетов также станут недействительными.

Чтобы преодолеть это, установите следующие ключи в фиксированные значения в:

`c:\%systemroot%\microsoft.net\framework\v2.0.50727\CONFIG\machine.config`

Вам необходимо добавить элемент конфигурации <machineKey> в раздел <system.web>. Здесь есть довольно хорошая статья, которая объясняет, как это сделать:

Как: настроить MachineKey в ASP.NET 2.0

Прокрутите вниз до раздела " Замечания по развертыванию веб-фермы " и сгенерируйте криптографически случайные ключи.

Если вы используете веб-ферму с балансировкой нагрузки, вам также необходимо установить для машинного ключа каждого сервера одно и то же значение.

Неправильная форма action значение (3.5SP1):

Существует также случай (публикация 3.5SP1), где, если вы установите для атрибута action формы ASP.NET значение, отличное от страницы, на которую вы отправляете сообщение, и вы не используете кросс-постбэки, то вы получите ошибка. Но вы увидите это сразу:

Не удалось проверить MAC представления состояния после установки .NET 3.5 SP1

Время / длинные страницы:

Существует также крайний случай для страниц, отображение которых занимает много времени, если страница частично визуализируется и происходит обратная передача:

Ошибка проверки MAC состояния состояния

Root Cause Это исключение появляется, потому что элементы управления используют DataKeyNames требуют, чтобы Viewstate был зашифрован. Когда Viewstate зашифрован (по умолчанию Режим Auto предназначен для шифрования элементов управления требуют, иначе нет) добавляет поле перед закрытием тег. Но это скрытое поле возможно, не было оказано браузер с продолжительными страницами и если вы делаете постбэк раньше, браузер инициирует обратную передачу без это поле (в форме почтового сбора). Конечным результатом является то, что если это поле опущено при обратной передаче, страница не знать, что Viewstate зашифрован и вызывает вышеупомянутое исключение. И.Е. страница ожидает полной загрузки прежде чем сделать обратную передачу.

11 голосов
/ 20 января 2011

Нам потребовалось некоторое время, чтобы найти ответ на этот вопрос, поскольку мне сообщили, что другой сервер IIS7, с которым я сравнивал его, был настроен таким же образом, тем же человеком.

Оказывается,сервер с веб-сайтами, которые получали эту ошибку, был настроен с помощью Plesk, тогда как другой сервер не был настроен.

Похоже, Plesk устанавливает время простоя на 5 минут для пулов приложений, что и быловызывая эту ошибку.

Чтобы изменить это, выполните следующие действия:

  1. Откройте IIS
  2. Щелкните узел пулов приложений
  3. Найдите приложение вашего веб-приложенияpool
  4. Щелкните правой кнопкой мыши и выберите Настройки Advanace
  5. Установите для свойства Время простоя (минуты) значение 0 или увеличьте его до 30+ минут
3 голосов
/ 02 июля 2018

Для меня это решило проблему:

Я установил LoadUserProfile = True в пуле приложений, чтобы сделать куст реестра HKCU доступным для приложения.

Примечание:Это совместимо с IIS 7.0 +

2 голосов
/ 29 октября 2012

Я столкнулся с этой проблемой, и сценарий представлял собой один веб-сервер, на котором размещалось очень простое приложение ASP.Net. После долгих попыток я нашел этот пост, и это помогло мне понять, что проблема в том, что рабочий процесс перерабатывается.

Я нахожу это довольно резким, так как это сценарий, с которым может столкнуться приложение, и такая ошибка в ядре мешает вам правильно его обработать. Насколько я мог видеть, это происходит потому, что в конфигурации по умолчанию для обработки этих ключей будет использоваться machine.config, в котором говорится, что ключи автоматически генерируются и изолируются для каждого приложения. Я считаю, что в этом случае ASP.Net является временным ключом и хранит его на уровне рабочего процесса, и когда этот рабочий процесс исчезает, проблема возникает и не может быть обработана.

Альтернатива настройки машинного ключа решает проблему, очевидно, лучше установить его в файле web.config, а не в целом machine.config, чтобы поддерживать его на самом низком уровне детализации.

Другой вариант - отключить проверку MAC состояния просмотра, также через web.config. Это будет зависеть от уровня безопасности вашего приложения и риска подделки состояния просмотра.

И лучший вариант - избегать использования состояния просмотра в приложении MVC.

0 голосов
/ 20 октября 2012

Проверка MAC-адреса состояния представления не удалась. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан одинаковый ключ validationKey и алгоритм проверки. Автогенерация не может быть использована в кластере Как я узнал, там было <base .... тег в части заголовка моей главной страницы, который я добавил в последний галстук и перед публикацией. Этот тег определяет URL-адрес по умолчанию и цель по умолчанию для всех ссылок на странице. На этот раз это было основной причиной ошибки.

...