Asp.net Проверка MAC-адреса состояния представления не удалась - PullRequest
29 голосов
/ 30 апреля 2011

В определенное время я получаю следующую ошибку на веб-сайте 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.

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

Ответы [ 13 ]

23 голосов
/ 30 апреля 2011

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

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

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

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

16 голосов
/ 15 апреля 2016

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

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

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

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

14 голосов
/ 25 февраля 2016

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

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

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

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

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

enter image description here

Дважды щелкните значок ключа машины, чтобы открыть этот экран:

enter image description here

Нажмите на ссылку «Создать ключи» справа, которую я обрисовал в общих чертах на рисунке выше.

Примечания:

  • Если вы выберете «Создать уникальный ключ дляКаждое приложение "флажок", IsolateApps "будет добавлено в конце ваших ключей.Я должен был удалить их, чтобы заставить приложение работать.Очевидно, что они не являются частью ключа.
  • SHA1 был методом шифрования по умолчанию, выбранным IIS, и если вы его измените, не забудьте изменить свойство проверки для machineKey в web.config.Однако методы и алгоритмы шифрования развиваются, поэтому, пожалуйста, не стесняйтесь редактировать этот пост с обновленным предпочтительным методом шифрования или упомянуть его в примечаниях, а я обновлю.
8 голосов
/ 01 марта 2016

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

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

    <configuration>

    <system.web>

    <machineKey ... />
    

    </system.web>

    </configuration>

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

2 голосов
/ 05 июня 2015

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

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

Определение машинного кода в файле 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="..." />

1 голос
/ 27 октября 2017

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

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

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

$('input:visible').each(function(ele, indx){
    this.value = this.value.toUpperCase();
});
0 голосов
/ 01 апреля 2019

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

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

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

0 голосов
/ 04 сентября 2018

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

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

0 голосов
/ 19 июля 2017

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

Ни одно из решений не сработало для меня.

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

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

aspnet_regiis -ga "IIS APPPOOL\My App Pool"

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

enableViewStateMac="false"

все еще не повезло.* Любая другая идея, чтобы решить эту проблему?

ОБНОВЛЕНИЕ:

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

<base href="/" />
0 голосов
/ 28 апреля 2016

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

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