Исключение "Заполнение недопустимо и не может быть удалено" на WebResource.axd
У меня есть приложение ASP.NET 2.0, которое отлично работает в нашей локальной среде. При публикации на тестовом сервере мы получаем периодически возникающие ошибки на сервере.
Вот наиболее распространенный:
Заполнение недействительно и не может быть удалено. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Security.Cryptography.CryptographicException: заполнение недопустимо и не может быть удалено.
Ошибка источника:
Во время выполнения текущего веб-запроса было сгенерировано необработанное исключение. Информация о происхождении и местоположении исключения может быть идентифицирована с помощью трассировки стека исключений ниже.
Трассировки стека:
[CryptographicException: дополнение является недопустимым и не может быть удалено.]
System.Security.Cryptography.RijndaelManagedTransform.DecryptData (Byte [] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte [] & outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast) +1545747
System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock (Byte [] inputBuffer, Int32 inputOffset, Int32 inputCount) +257
System.Security.Cryptography.CryptoStream.FlushFinalBlock () +30 System.Web.Configuration.
System.Web.UI.Page.DecryptString (String s) +83
System.Web.Handlers.AssemblyResourceLoader.System.Web.IHttpHandler.ProcessRequest (контекст HttpContext) +148
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +358 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логический и завершенный синхронно) +64
Это происходит по запросу к конкретному запросу WebResource.axd.
Другая ошибка, которую мы видим, это:
Проверка MAC представления состояния не удалась. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан один и тот же ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере. Описание: во время выполнения текущего веб-запроса произошло необработанное исключение. Пожалуйста, просмотрите трассировку стека для получения дополнительной информации об ошибке и о том, где она возникла в коде.
Сведения об исключении: System.Web.HttpException: не удалось проверить MAC состояния представления. Если это приложение размещено на веб-ферме или в кластере, убедитесь, что в конфигурации указан один и тот же ключ validationKey и алгоритм проверки. Автогенерация не может использоваться в кластере.
Эта ошибка иногда возникает при публикации формы.
Теперь, прежде чем перейти и сказать мне очевидный (обычный) ответ на эту ошибку, подумайте:
- Приложение развернуто в Windows Server 2003 на IIS6
- Это НЕ на веб-ферме. Здесь используется только один веб-сервер.
- Идентификатор пула приложений - это учетная запись настраиваемой службы, и я запустил
aspnet_regiss -ga <username>
на сервере. Нет эффекта.
3 ответа
Ошибка в том, что ваш домен приложений был переработан / перезапущен. Когда это происходит, приложение и ключ машины устанавливаются в автоматический режим, он меняется. Это влияет на расшифровку информации в URL-адресе ресурсов (.axd). Установка фиксированного машинного ключа предотвратит его повторение.
Пожалуйста, проверьте это для получения дополнительной информации о подобном случае (объяснение с проблемой с проверкой состояния представления, но причина та же самая): http://www.developmentnow.com/blog/InvalidViewstate+Or+Unable+To+Validate+Data+Error.aspx
Я тоже долго думал об этом. После того, как я увидел этот вопрос, он снова понял меня: это попытка нарушить безопасность моего сайта ASP.Net?... на что я только что ответил почти так же. У меня было ощущение, что это происходило при некотором перезапуске чего-либо, потому что когда мы публиковали что-то, что перерабатывало приложение, в журнале отображалась ошибка, но у меня не было другого источника с указанием его связи (сегодня я обнаружил этот случай на invalidviewstate из-за поменять машинку:))
Ps. выше, наконец, объясняет это на одном сервере:)
Эта проблема возникает, когда сообщение создается до полной загрузки страницы в браузере. Посмотрите на этот вопрос.
Бен,
Что касается вашей первой проблемы, я обнаружил, что это выглядит немного более точно, чем то, что вы видите в том, что проблема возникает спорадически. Вы сможете найти полное объяснение этому на http://www.codeproject.com/KB/security/Cryptor.aspx.
Что вам действительно нужно сделать, это установить RijndaelAlg.Padding в PaddingMode.ISO10126, PaddingMode.PKCS7 или PaddingMode.ANSIX923. Любое из этих трех значений должно работать при условии, что вы используете одно и то же значение при шифровании и дешифровании. Другие значения будут работать с некоторыми данными, но не со всеми данными. Приведенный выше URL объясняет почему.
Чего я не понимаю, так это того, что Microsoft предоставляет варианты, которые иногда не работают, или, по крайней мере, почему они не устанавливают надежные параметры по умолчанию.