Странное необработанное исключение из приложения asp.net - проверка MAC представления состояния не удалась - PullRequest
11 голосов
/ 23 сентября 2008

Я не знаю, видел ли кто-нибудь эту проблему раньше, но я просто в замешательстве. Вот необработанное сообщение об исключении, которое захватывает моя страница ошибки.

Сообщение об ошибке: проверка MAC представления состояния не удался. Если это приложение размещается на веб-ферме или кластер, убедитесь, что конфигурация указывает тот же validationKey и алгоритм проверки. AutoGenerate нельзя использовать в кластере.

Трассировка стека: в System.Web.UI.ViewStateException.ThrowError (Exception внутренняя, String persistedState, String errorPageMessage, Boolean macValidationError) в System.Web.UI.ObjectStateFormatter.Deserialize (String inputString) в System.Web.UI.ObjectStateFormatter.System.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 (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) в System.Web.UI.Page.ProcessRequest (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) в System.Web.UI.Page.ProcessRequest () в System.Web.UI.Page.ProcessRequestWithNoAssert (HttpContext контекст) в System.Web.UI.Page.ProcessRequest (HttpContext контекст) в ASP.generic_aspx.ProcessRequest (HttpContext контекст) в System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () в System.Web.HttpApplication.ExecuteStep (IExecutionStep шаг, логическое и завершено синхронно)

Источник: System.Web

У кого-нибудь есть идеи, как мне решить эту проблему? Спасибо.

Ответы [ 6 ]

17 голосов
/ 23 сентября 2008

Кажется, я помню, что эта ошибка может возникнуть, если вы нажмете кнопку / ссылку и т. Д. До полной загрузки страницы.

В этом случае ошибка вызвана функцией ASP.net 2.0, которая называется Проверка события. Это функция безопасности, которая гарантирует, что действия обратной передачи происходят только из событий, разрешенных и созданных сервером, чтобы помочь предотвратить поддельные обратные передачи. Эта функция реализована с помощью элементов управления, регистрирующих допустимые события при их рендеринге (как, например, во время их реальных методов Render ()). Конечным результатом является то, что в нижней части вашего рендеринга тег формы, вы увидите что-то вроде этого:

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION"  value="AEBnx7v.........tS" />

Когда происходит обратная передача, ASP.net использует значения, хранящиеся в этом скрытом поле, чтобы убедиться, что нажатая кнопка вызывает допустимое событие. Если он недействителен, вы получите исключение, которое вы видели.

Проблема, с которой вы сталкиваетесь, возникает, в частности, при обратной передаче до отображения поля EventValidation. Если EventValidation включен (что по умолчанию), но ASP.net не видит скрытое поле при обратной передаче, вы также получаете исключение. Если вы отправите форму до того, как она будет полностью обработана, то, скорее всего, поле EventValidation еще не было обработано, и поэтому ASP.net не может подтвердить ваш щелчок.

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

из http://forums.asp.net/p/955145/1173230.aspx

12 голосов
/ 23 сентября 2008

@ Крис

если проблема заключается в щелчке элемента до полной визуализации страницы, asp.net 3.5 SP1 добавил запись web.config в элемент страницы с именем renderAllHiddenFieldsAtTopOfForm .

4 голосов
/ 23 сентября 2008

у вас есть несколько серверов, на которых запущено это приложение и / или есть веб-сад? Если да, вам нужно установить машинный ключ в web.config

1 голос
/ 26 сентября 2008

Для тех, кто в конечном итоге борется с этой проблемой, есть полезная ссылка на некоторые обходные пути:

http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx

1 голос
/ 23 сентября 2008

По умолчанию ASP.NET включает цифровую подпись значения ViewState на странице. Это делается с помощью автоматически сгенерированного ключа, который хранится в памяти. Это сделано для того, чтобы злоумышленник не мог изменить ViewState из браузера и, например, предоставить ему доступ к вещам, к которым у него обычно нет доступа.

ASP.NET также может шифровать ViewState, но по умолчанию он отключен по соображениям производительности. На многих веб-сайтах гораздо важнее убедиться, что содержимое ViewState не «испорчено», чем сохранить его конфиденциальность.

В сообщении об ошибке говорится, что проверка подписи не удалась. Страница была опубликована с использованием ViewState, но подпись ViewState не соответствовала подписи, рассчитанной для ключей, хранящихся на сервере.

Самая распространенная причина этой ошибки - использование двух или более веб-серверов в среде, подобной ферме: один сервер отправляет исходную страницу, подписанную ключом в памяти на этом сервере, но страница отправляется обратно. на второй (или третий ...) сервер. Поскольку два или более серверов не используют общий ключ подписи, подписи не совпадают.

... Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан тот же validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере.

В сообщении об ошибке сообщается, что вы используете атрибут validationKey ( подробности в MSDN ) в вашем файле web.config, чтобы жестко закодировать ключ подписи в значение, общее для всех ваши серверы, вместо того, чтобы использовать динамически сгенерированный. Таким образом, проверка подписи может быть успешной независимо от того, какой сервер получает обратную передачу.

Вы могли бы отключить проверку, но это очень опасно. Это означает, что любой хакер с небольшим количеством свободного времени может подделать значения в вашем приложении. Например, если вы сохраняете цену товара в значении ViewState, хакер может изменить это значение с браузера на 0,01 долл. США непосредственно перед выставлением заказа.

0 голосов
/ 23 сентября 2008

Я знаю, что вы можете отключить проверку MAC-адреса viewstate, но я думаю, что если страница не загружена, вы можете столкнуться с большими проблемами. Когда я столкнулся с этой проблемой, мне пришлось отключить все кнопки до полной загрузки страницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...