Asp.net Проверка MAC состояния просмотра не удалась

Иногда на веб-сайте asp.net я получаю следующую ошибку.

 Sys.WebForms.PageRequestManagerServerErrorException: 
 Validation of viewstate MAC failed. 
 If this application is hosted by a Web Farm or cluster,
 ensure that <machineKey> configuration specifies the 
 same validationKey and validation algorithm. 
 AutoGenerate cannot be used in a cluster.

Когда происходит обновление страницы, проблем нет. Как я могу решить эту проблему?


person Arbelac    schedule 30.04.2011    source источник
comment
Требуется дополнительная информация. Это на вашей единственной машине разработчика? Производственный сервер? Есть ли несколько производственных серверов (например, веб-ферма)?   -  person Pure.Krome    schedule 30.04.2011
comment
У меня такая же ошибка в моей команде разработчиков. Некоторые компьютеры получают эту ошибку, а некоторые - нет. Кто-нибудь может дать ответ? (Ни один из двух опубликованных не может решить мою проблему)   -  person Apolo    schedule 15.04.2015
comment
Я видел этот пост в MSDN (blogs.msdn.com/b/webtopics/archive/2009/05/13/), вы есть код для воспроизведения. Предоставленное решение (удалить атрибут действия формы) не подходит (потому что моя форма никуда не денется)   -  person Apolo    schedule 15.04.2015


Ответы (17)


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

<machineKey validationKey="JFDSGOIEURTJKTREKOIRUWTKLRJTKUROIUFLKSIOSUGOIFDS..." decryptionKey="KAJDFOIAUOILKER534095U43098435H43OI5098479854" validation="SHA1" />

Поместите его под тег <system.web>.

AutoGenerate для машинного кода использовать нельзя. Чтобы сгенерировать собственный ключ machineKey, см. Этот сценарий PowerShell: https://support.microsoft.com/en-us/kb/2915218#bookmark-appendixa.

person mBotros    schedule 30.04.2011
comment
У меня есть эта строка в моем web.config, но я все еще получаю эту ошибку. - person Tony Dong; 08.06.2019
comment
@TonyDong он должен идти в machine.config файл в папке Windows (где-то в подпапке Microsoft.NET). - person intrepidis; 23.09.2019

У меня была эта проблема, и для меня ответ отличался от других ответов на этот вопрос.

У меня есть приложение с большим количеством клиентов. Я улавливаю все ошибки в application_error в global.asax и отправляю себе электронное письмо с подробным описанием ошибки. После того, как я опубликовал новую версию своих приложений, я начал получать много сообщений об ошибке Validation of viewstate MAC failed.

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

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

person Sébastien    schedule 15.04.2016

Microsoft сообщает никогда не используйте веб-сайт генератора ключей.

Как и все здесь, я добавил это в свой web.config.

<System.Web>
    <machineKey decryptionKey="ABC123...SUPERLONGKEY...5432JFEI242" 
                validationKey="XYZ234...SUPERLONGVALIDATIONKEY...FDA" 
                validation="SHA1" />
</system.web>

Однако я использовал IIS в качестве своего генератора machineKey следующим образом:

  1. Откройте IIS и выберите веб-сайт, чтобы получить этот экран:

введите описание изображения здесь

  1. Дважды щелкните значок Machine Key, чтобы открыть этот экран:

введите описание изображения здесь

  1. Щелкните ссылку Generate Keys справа, которую я обрисовал в общих чертах на картинке выше.

Примечания:

  • Если вы установите флажок «Создать уникальный ключ для каждого приложения», IsolateApps будет добавлен в конец ваших ключей. Мне пришлось удалить их, чтобы приложение заработало. Очевидно, они не являются частью ключа.
  • SHA1 был методом шифрования по умолчанию, выбранным IIS, и если вы его измените, не забудьте изменить свойство проверки на machineKey в файле web.config. Однако методы и алгоритмы шифрования развиваются, поэтому, пожалуйста, не стесняйтесь редактировать этот пост с помощью обновленного предпочтительного метода шифрования или упоминать его в примечаниях, и я обновлю его.
person Tony L.    schedule 25.02.2016
comment
Я считаю этот подход намного лучше, чем подход PowerShell, предложенный Microsoft (пусть он будет простым), и гораздо более надежным, чем те веб-страницы, которые генерируют ключи автоматически. - person Cleptus; 28.05.2018

Это решение работало для меня в ASP.NET 4.5 с использованием сайта веб-форм.

  1. Используйте следующий сайт для создания машинного ключа: http://www.blackbeltcoder.com/Resources/MachineKey.aspx
  2. Скопируйте полный машинный ключевой код.
  3. Перейдите в свой файл Web.Config.
  4. Вставьте машинный ключ в следующий раздел кода:
    <configuration>
      <system.web>
        <machineKey ... />
      </system.web>
    </configuration> 

Вы больше не должны видеть ошибку viewstate Mac failed. Каждый веб-сайт в одном пуле приложений должен иметь отдельный машинный ключ, иначе эта ошибка будет продолжаться.

person TsTeaTime    schedule 01.03.2016
comment
Я получаю сообщение об ошибке: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS. Понятно, что это значит. - person AskYous; 19.04.2016
comment
Вы используете сайт веб-форм на asp.net? - person TsTeaTime; 19.04.2016

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

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

Определение машинного кода в web.config решило проблему. Но вместо использования сторонних сайтов для генерации кода, который может быть поврежден, запустите это из своей командной оболочки: На основе решения Microsoft 1a, https://support.microsoft.com/en-us/kb/2915218#AppendixA

# Generates a <machineKey> element that can be copied + pasted into a Web.config file.
function Generate-MachineKey {
  [CmdletBinding()]
  param (
    [ValidateSet("AES", "DES", "3DES")]
    [string]$decryptionAlgorithm = 'AES',
    [ValidateSet("MD5", "SHA1", "HMACSHA256", "HMACSHA384", "HMACSHA512")]
    [string]$validationAlgorithm = 'HMACSHA256'
  )
  process {
    function BinaryToHex {
        [CmdLetBinding()]
        param($bytes)
        process {
            $builder = new-object System.Text.StringBuilder
            foreach ($b in $bytes) {
              $builder = $builder.AppendFormat([System.Globalization.CultureInfo]::InvariantCulture, "{0:X2}", $b)
            }
            $builder
        }
    }
    switch ($decryptionAlgorithm) {
      "AES" { $decryptionObject = new-object System.Security.Cryptography.AesCryptoServiceProvider }
      "DES" { $decryptionObject = new-object System.Security.Cryptography.DESCryptoServiceProvider }
      "3DES" { $decryptionObject = new-object System.Security.Cryptography.TripleDESCryptoServiceProvider }
    }
    $decryptionObject.GenerateKey()
    $decryptionKey = BinaryToHex($decryptionObject.Key)
    $decryptionObject.Dispose()
    switch ($validationAlgorithm) {
      "MD5" { $validationObject = new-object System.Security.Cryptography.HMACMD5 }
      "SHA1" { $validationObject = new-object System.Security.Cryptography.HMACSHA1 }
      "HMACSHA256" { $validationObject = new-object System.Security.Cryptography.HMACSHA256 }
      "HMACSHA385" { $validationObject = new-object System.Security.Cryptography.HMACSHA384 }
      "HMACSHA512" { $validationObject = new-object System.Security.Cryptography.HMACSHA512 }
    }
    $validationKey = BinaryToHex($validationObject.Key)
    $validationObject.Dispose()
    [string]::Format([System.Globalization.CultureInfo]::InvariantCulture,
      "<machineKey decryption=`"{0}`" decryptionKey=`"{1}`" validation=`"{2}`" validationKey=`"{3}`" />",
      $decryptionAlgorithm.ToUpperInvariant(), $decryptionKey,
      $validationAlgorithm.ToUpperInvariant(), $validationKey)
  }
}

Потом:

Для ASP.NET 4.0

Generate-MachineKey

Ваш ключ будет выглядеть так: <machineKey decryption="AES" decryptionKey="..." validation="HMACSHA256" validationKey="..." />

Для ASP.NET 2.0 и 3.5

Generate-MachineKey -validation sha1

Ваш ключ будет выглядеть так: <machineKey decryption="AES" decryptionKey="..." validation="SHA1" validationKey="..." />

person Zly-Zly    schedule 05.06.2015
comment
Вы делаете это на сервере, на котором размещен сайт? У меня общий план хостинга. На мой веб-сайт могут попасть разные машины в разных местах / сети / - person FunMatters; 19.05.2018
comment
Да, на сервере веб-приложений в вашем web.config - person Zly-Zly; 31.05.2018
comment
Ткс. Мне удалось обновить web.config ключами серверной машины, предоставленными моей хостинговой компанией. - person FunMatters; 31.05.2018

Уважаемые Все, со всеми ответами на ответы там есть случай, выдает эту ошибку, когда значение web.config равно

<httpCookies httpOnlyCookies="true" requireSSL="true"/>

и ссылка http, а не https

person Omar Kamel    schedule 01.04.2019
comment
а) это другой вопрос, а не ответ б) это НЕ связано с исходным Q - person eidylon; 15.11.2020
comment
@eidylon Для меня ЭТО связано, я пришел сюда с тем же сообщением об ошибке, и этот ответ решает мою проблему. - person George Wurthmann; 18.01.2021

моя проблема была в этом фрагменте кода javascript

$('input').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});

Оказывается, он возился со скрытым полем viewstate, поэтому я изменил его на код ниже, и он сработал

$('input:visible').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});
person irfandar    schedule 27.10.2017

ЧТО Сработало для меня

  1. Выполните поиск в Интернете по запросу "Генератор ключей MachineKey".

  2. Перейдите на один из найденных сайтов и сгенерируйте машинный ключ, который будет выглядеть как ... (цифры больше)
    ... MachineKey
    validationKey = "0EF6C03C11FC ... 63EAE6A00F0B6B35DD4B" decryptionKey = "2F5E2FD80991C629. ..3ACA674CD3B5F068 "validation =" SHA1 "decryption =" AES "/>

  3. Скопируйте и вставьте в раздел <system.web> файла web.config.

Если хочешь пойти по моему пути ...


https://support.microsoft.com/en-us/kb/2915218#AppendixA
Устранение ошибок кода проверки подлинности сообщения о состоянии представления (MAC) Решение 3b. Используйте явный <machineKey>
Добавляя явный элемент <machineKey> в файл Web.config приложения, разработчик сообщает ASP.NET не использовать автоматически сгенерированный криптографический ключ. См. Приложение A для получения инструкций о том, как сгенерировать элемент <machineKey>.


http://blogs.msdn.com/b/amb/archive/2012/07/31/easiest-way-to-generate-machinekey.aspx
Самый простой способ сгенерировать MachineKey - Ахмет Митхат Бостанчи - 31 июля 2012 г. выполните поиск в Bing по запросу "Генератор ключей MachineKey" и воспользуйтесь онлайн-сервисом. Честно...


http://www.blackbeltcoder.com/Resources/MachineKey.aspx

person Ricardo Conte    schedule 12.01.2016
comment
Ссылка на службу поддержки MS, которую вы дали, настоятельно не одобряет использование сетевых генераторов MachineKey support.microsoft.com/en -us / kb / 2915218 # Приложение A - person Tony L.; 25.02.2016

Это сообщение об ошибке обычно отображается после того, как вы опубликовали свой веб-сайт на сервере.

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

Настройте свой веб-сайт для использования соответствующей версии .NET Framework (например, v4.0) в разделе «Общие» пула приложений, связанного с вашим веб-сайтом.

В модели процесса установите для параметра Identity значение Network Service.

Закройте диалоговое окно, щелкните свой веб-сайт правой кнопкой мыши и выберите «Дополнительные параметры ...» в разделе «Управление веб-сайтом» в меню содержимого. В диалоговом окне в разделе «Общие» убедитесь, что вы выбрали правильное имя пула приложений, который будет использоваться.

Теперь ваш сайт должен работать без проблем.

Надеюсь, это поможет вам преодолеть эту ошибку.

person Nanan    schedule 07.09.2012
comment
Несмотря на то, что это полезные советы по настройке, сообщение TC, что теперь ваш веб-сайт должен работать без каких-либо проблем, вводит в заблуждение. Настоящий ответ действительно находится в machineKey, как указано в других ответах. - person DanM7; 02.10.2012
comment
Изменение удостоверения с ApplicationPoolIdentity на NetworkService дает IIS гораздо больше разрешений, чем необходимо. Это снова снижает безопасность решения проблемы. Пожалуйста, прочтите следующее для дальнейшего объяснения: iis.net/learn/ управление / настройка-безопасность / - person Carlosfocker; 15.02.2013

Проверка MAC состояния просмотра не удалась. Если это приложение размещено на веб-ферме или кластере, убедитесь, что в конфигурации <machineKey> указан один и тот же ключ проверки и алгоритм проверки. AutoGenerate нельзя использовать в кластере.

Отвечать :

<machineKey  decryptionKey="2CC8E5C3B1812451A707FBAAAEAC9052E05AE1B858993660" validation="HMACSHA256" decryption="AES" validationKey="CB8860CE588A62A2CF9B0B2F48D2C8C31A6A40F0517268CEBCA431A3177B08FC53D818B82DEDCF015A71A0C4B817EA8FDCA2B3BDD091D89F2EDDFB3C06C0CB32" />

person Tavasul Ahmed    schedule 20.02.2016

У меня была такая же проблема, и это было связано с Gridview (сгенерированным из кода vb) на странице, на которой была включена сортировка. Отключение сортировки устранило мою проблему. У меня нет этой проблемы с gridviews, созданными с использованием SQLdatasource.

person aydin    schedule 28.04.2016
comment
Это странно. Вероятно, для включения сортировки необходимо, чтобы ключи данных были включены в состояние просмотра, и asp.net зашифровывает их. Следовательно, вы получаете ошибку проверки. - person Ε Г И І И О; 13.02.2019

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

Ни одно из решений не помогло мне.

Я установил машинный ключ с помощью скрипта Microsoft и скопировал его в свой web.config

Я выполнил сценарий asp.net regiis.

aspnet_regiis -ga "IIS APPPOOL\My App Pool"

Также пробовал добавить на страницу этот код:

enableViewStateMac="false"

все равно не повезло.

Есть ли еще идея решить эту проблему?

ОБНОВЛЕНИЕ:

Наконец я решил проблему. Я интегрировал свой компонент angular 4 на свой сайт asp.net. Поэтому я добавил базовый href на свою главную страницу. Я удалил этот код, и теперь он работает нормально.

<base href="/" />
person Salim    schedule 19.07.2017
comment
Для всех, кто хочет попробовать enableViewStateMac="false", я думаю, что он устарел: blogs.msdn.microsoft.com/webdev/2014/09/09/ Цитата: Все версии среды выполнения ASP.NET 1.1–4.5.2 теперь запрещают установку ‹% @ Page EnableViewStateMac =” false ”%› и ‹Страниц enableViewStateMac =” false ”/›. - person Jeff Mergler; 26.06.2018

Есть еще один сценарий, который происходил с моими клиентами. Это происходило нормально в определенное время из-за смены смен, и пользователям приходилось входить в систему под другим пользователем. Вот сценарий, при котором система защиты от подделки защищает систему, генерируя эту ошибку:

1- Как только закройте / откройте ваш браузер. 2- Перейдите на свой веб-сайт и войдите в систему с помощью «Пользователь A» 3- Откройте новую вкладку в браузере и введите тот же адрес сайта. (Вы можете увидеть домашнюю страницу своего сайта без какой-либо аутентификации) 4- Выйдите из системы и войдите с другим пользователем (Пользователь B) во второй вкладке. 5- Теперь вернитесь к первой вкладке, в которую вы вошли «пользователем A». Вы все еще можете видеть страницу, но любое действие на этой вкладке приведет к ошибке. Поскольку ваш файл cookie уже обновлен «пользователем Б», и вы пытаетесь отправить запрос недействительным пользователем. (Пользователь A)

person Community    schedule 04.09.2018

Я столкнулся с аналогичной проблемой на моем веб-сайте, размещенном в IIS. Эта проблема обычно связана с настройками пула приложений IIS. Поскольку пул приложений перезагружается через некоторое время, это вызвало у меня проблему.

Следующие шаги помогут мне решить проблему:

  1. Откройте пул приложений своего веб-сайта в IIS.
  2. Перейдите к расширенным настройкам на правой панели.
  3. Прокрутите вниз до Модель процесса.
  4. Измените время ожидания простоя в минутах на 20 или количество минут, которое вы не хотите повторно использовать в пуле приложений.

введите описание изображения здесь

Затем попробуйте еще раз. Это решит вашу проблему.

person Ashish Thakur    schedule 28.11.2019

У меня возникла такая же проблема в нашем проекте. Этот веб-сайт поддержки Microsoft страница помогла мне найти причину. И это решение помог разобраться в проблеме.

В моем случае проблема заключалась в ViewStateUserKey, поскольку свойство Page.ViewStateUserKey имело неверное значение (Вызвано 4 здесь). Удаление сертификатов localhost и их воссоздание путем восстановления IIS Expres, как указано в здесь исправил проблему.

person CharithJ    schedule 13.01.2020

Это сработало для меня

Просто добавьте его: между разделом system.web ‹system.web›

‹/System.web›

person Yusuf Ünlü    schedule 11.06.2021

person    schedule
comment
Некоторое объяснение и правильное форматирование было бы неплохо - person Andronicus; 16.08.2019