Я развернул веб-сайт asp.net webforms на машине под управлением Windows WebServer 2008 и IIS 7. AppPool использует Framework 4, интегрированный конвейер, работающий от имени пользователя домена. я не запуск веб-фермы или веб-сада. У веб-сайта есть только одна привязка к http-порту 80.
Я получаю сообщение «Ошибка проверки MAC состояния просмотра» при обратной отправке любой страницы, кроме страницы входа.
В этом приложении мы устанавливаем ViewStateUserKey на Session.SessionID в коде позади для каждой страницы, кроме страницы входа. Когда я закомментирую эту строку (то есть, когда я перестаю устанавливать ViewStateUserKey), ошибка исчезает.
Ошибка также исчезает, когда я устанавливаю "enableViewStateMAC" в значение false.
Везде, где я искал эту ошибку, советую посмотреть на machineKey. Я пробовал использовать автоматически сгенерированные машинные ключи по умолчанию и определенные машинные ключи (примеры ниже), а также попытался удалить тег machineKey из web.config, но безуспешно.
Это приложение успешно работает на другом сервере (также Windows Web Server 2008, IIS 7, framework v4). Успешное приложение устанавливает для ViewStateUserKey значение SessionId, а machineKey аналогичен третьему примеру, приведенному ниже, с определенными ключами дешифрования и проверки.
Я сбит с толку, почему это приложение будет нормально работать на сервере «A», но имеет недопустимое ViewState на сервере «B». Если у кого-то есть предложение, как отладить эту проблему, я был бы очень признателен.
<machineKey decryption="Auto" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" validationKey="AutoGenerate,IsolateApps" />
<machineKey decryption="AES" decryptionKey="AutoGenerate,IsolateApps" validation="SHA1" validationKey="AutoGenerate,IsolateApps" />
<machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />
Можете ли вы подтвердить, что файл cookie сеанса действительно существует и отправляется с каждым запросом? IIRC, получающий доступ к SessionID, если сеанса нет, будет просто возвращать новое значение с каждым запросом.
Вы также можете посмотреть, что шаблоны проекта «Файл» -> «Создать» -> «Проект» -> ASP.NET Web Forms Project делают в Visual Studio 2012/2013. В частности, посмотрите на Site.Master.cs в новом шаблоне проекта. Этот код использует отдельный (не сеансовый) файл cookie именно для того, чтобы избежать проблем, связанных с попыткой поддерживать сеанс в приложении.
Использование этого подхода также позволяет вам установить защиту от CSRF на вашей странице Login.aspx, чтобы эта страница также была защищена.