Странное необработанное исключение из приложения asp.net - проверка MAC представления состояния не удалась
Я не знаю, видел ли кто-нибудь эту проблему раньше, но я просто в тупике. Вот необработанное сообщение об исключении, которое захватывает моя страница ошибки.
Сообщение об ошибке: Ошибка проверки состояния MAC. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан один и тот же ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере.
Трассировка стека: в System.Web.UI.ViewStateException.ThrowError(Исключение внутреннее, String persistedState, String errorPageMessage, Boolean macValidationError) в System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) в System.Web.UI.matterState.Web.UI.IStateFormatter.Deserialize(String serializedState) в System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) в System.Web.UI.HiddenFieldPageStatePersister.Load() в System.Web.UI.Page.LoadPageStateFromPersistenceMedium() в System.Web.UI.Page.LoadAllState() в System.Web.UI.Page.ProcessRequestMain(логическое значение includeStagesBeforeAsyncPoint, логическое значение includeStagesAfterAsyncPoint) в System.Web.UI.Page. Boosinc_ExchangeAccessSecPointSecureSecureSecureSecceptSecPointScessSecreSecreSecreSecreSecreSecreRe System.Web.UI.Page.ProcessRequest () в System.Web.UI.Page.ProcessRequestWithNoAssert (контекст HttpContext) в System.Web.UI.Page.ProcessRequest (контекст HttpContext) в ASP.generic_aspx.ProcessRe квест (контекст HttpContext) на System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () на System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое завершение и выполнение)
Источник: System.Web
У кого-нибудь есть идеи, как я могу решить эту проблему? Благодарю.
6 ответов
Кажется, я помню, что эта ошибка может возникнуть, если вы нажмете кнопку / ссылку и т. Д. До полной загрузки страницы.
В этом случае ошибка вызвана функцией ASP.net 2.0, которая называется Проверка события. Это функция безопасности, которая гарантирует, что действия обратной передачи происходят только из событий, разрешенных и созданных сервером, чтобы помочь предотвратить поддельные обратные передачи. Эта функция реализована с помощью элементов управления, регистрирующих действительные события при их рендеринге (как, например, во время их реальных методов Render()). Конечным результатом является то, что в нижней части визуализированного тега формы вы увидите что-то вроде этого:
<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="AEBnx7v.........tS" />
Когда происходит обратная передача, ASP.net использует значения, хранящиеся в этом скрытом поле, чтобы убедиться, что нажатая кнопка вызывает допустимое событие. Если он недействителен, вы получите исключение, которое вы видели.
Проблема, с которой вы сталкиваетесь, возникает, в частности, при обратной передаче до отображения поля EventValidation. Если EventValidation включен (что по умолчанию), но ASP.net не видит скрытое поле при обратной передаче, вы также получаете исключение. Если вы отправите форму до того, как она будет полностью обработана, то, скорее всего, поле EventValidation еще не было обработано, и, следовательно, ASP.net не сможет подтвердить ваш щелчок.
Конечно, можно обойти это, просто отключив проверку событий, но вы должны знать о последствиях для безопасности. В качестве альтернативы, просто никогда не отправляйте обратно, пока форма не закончит рендеринг Конечно, это сложно сказать пользователям, но, возможно, вы могли бы отключить пользовательский интерфейс, пока форма не будет отображена?
Если проблема заключается в щелчке элемента до полной визуализации страницы, asp.net 3.5 с пакетом обновления 1 (SP1) добавляет запись web.config в элемент страницы с именем renderAllHiddenFieldsAtTopOfForm.
У вас есть несколько серверов, на которых запущено это приложение и / или есть веб-сад? Если да, вам нужно установить ключ компьютера в файле web.config.
Для тех, кто в конечном итоге борется с этой проблемой, вот полезная ссылка на некоторые обходные пути:
http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx
По умолчанию ASP.NET включает цифровую подпись значения ViewState на странице. Это делается с помощью автоматически сгенерированного ключа, который хранится в памяти. Это сделано для того, чтобы не дать злоумышленнику изменить ViewState из браузера и, например, предоставить ему доступ к вещам, к которым у него обычно не было бы доступа.
ASP.NET также может, необязательно, шифровать ViewState, но он отключен по умолчанию из соображений производительности. На многих веб-сайтах гораздо важнее убедиться, что содержимое ViewState не "испорчено", чем сохранить его конфиденциальность.
Сообщение об ошибке говорит о том, что проверка подписи не удалась. Страница была опубликована с использованием ViewState, но подпись ViewState не соответствовала подписи, рассчитанной для ключей, хранящихся на сервере.
Наиболее распространенная причина этой ошибки заключается в том, что вы используете два или более веб-сервера в фермероподобной среде: один сервер отправляет исходную страницу, подписанную ключом в памяти на этом сервере, но страница отправляется обратно на второй (или третий...) сервер. Поскольку два или более серверов не разделяют ключ подписи, подписи не совпадают.
... Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан одинаковый ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере.
Сообщение об ошибке говорит вам об использовании атрибута validationKey ( см. Подробности в MSDN) в вашем файле web.config для жесткого кодирования ключа подписи к значению, общему для всех ваших серверов, вместо использования динамически сгенерированного. Таким образом, проверка подписи может быть успешной независимо от того, какой сервер получает обратную передачу.
Вы можете отключить проверку, но это очень опасно. Это означает, что любой хакер с небольшим количеством свободного времени может подделать значения в вашем приложении. Например, если вы сохраняете цену товара в значении ViewState, хакер может изменить значение из браузера до 0,01 долл. США непосредственно перед выставлением заказа.
Я знаю, что вы можете отключить проверку MAC представления состояния, но я думаю, что если страница не загружена, вы можете столкнуться с большими проблемами. Когда я столкнулся с этой проблемой, мне пришлось отключить все кнопки до полной загрузки страницы.