"Ошибка при выполнении криптографической операции при расшифровке cookie Forms"
У меня возникла проблема после загрузки моего веб-сайта на хостинг. Появилось следующее сообщение об ошибке: "Произошла ошибка во время криптографической операции."
Я провел некоторые исследования и обнаружил, что куки формальной аутентификации связаны с MachineKey, который отличается при использовании веб-хостинга.
Я нашел метод, который должен исправить эту проблему, но ошибка все равно сохраняется.
КОД:
/// <summary>
/// Этот метод удаляет куки, если machine key отличается от того, который сохранил куки.
/// </summary>
protected void Application_Error(object sender, EventArgs e)
{
var error = Server.GetLastError();
var cryptoEx = error as CryptographicException;
if (cryptoEx != null)
{
FederatedAuthentication.WSFederationAuthenticationModule.SignOut();
Global.Cookies.FormAuthenticated cookie = new Global.Cookies.FormAuthenticated();
cookie.Delete();
Server.ClearError();
}
}
STACKTRACE:
[CryptographicException: Произошла ошибка во время криптографической операции.]
System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors(Func`2 func, Byte[] input) +115
System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.Unprotect(Byte[] protectedData) +59
System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) +9824926
Archive_Template.Main.resolveLoginUser(String sessionKey) in f:\Archive_Template\Archive_Template\Main.aspx.cs:481
Archive_Template.Main.OnPreInit(EventArgs e) in f:\Archive_Template\Archive_Template\Main.aspx.cs:52
System.Web.UI.Page.PerformPreInit() +31
System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +335
Как я могу решить эту проблему с ошибкой криптографической операции?
5 ответ(ов)
Я столкнулся с той же проблемой. Я просто очистил все куки и данные кэша браузера, и проблема была решена. Надеюсь, что это поможет и вам.
Для тех, кто еще не решил свою проблему: у меня не хватало раздела "machineKey" для шифрования/расшифрования в файле web.config.
Если вы используете аутентификацию форм, вы можете завершить сеанс, когда у вас возникнет исключение, и позволить вашим пользователям выполнить вход, чтобы создать корректный cookie. Вот пример кода, который демонстрирует это:
catch (CryptographicException cex)
{
FormsAuthentication.SignOut();
}
В этом коде, при возникновении исключения CryptographicException
, происходит выход из текущей аутентификации, что позволяет пользователю снова войти в систему и получить действительный cookie.
Причина этого в отсутствии ключа машины, который используется в качестве симметричного ключа для шифрования и дешифрования.
Чтобы установить ключ машины в IIS, выполните следующие шаги:
- Перейдите в ваше приложение.
- Выберите "Machine Keys".
- Нажмите "Generate Keys".
Я столкнулся с этой проблемой, когда пытался расшифровать cookie аутентификации форм, созданное приложением ASP.NET 2.0, внутри проекта Web API на .NET 4.5. Решением стало добавление атрибута "compatibilityMode" в узел "machineKey" файла web.config моего веб-API:
<machineKey
...
compatibilityMode="Framework20SP2"/>
Документация: https://msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx
Согласно документации, допустимые значения для этого атрибута:
Framework20SP1. Это значение указывает, что ASP.NET использует методы шифрования, доступные в версиях ASP.NET, выпущенных до 2.0 SP2. Используйте это значение для всех серверов в веб-ферме, если хотя бы один сервер имеет версию .NET Framework ниже 2.0 SP2. Это значение по умолчанию, если в файле Web.config приложения атрибут targetFramework элемента httpRuntime установлен на "4.5".
Framework20SP2. Это значение указывает, что ASP.NET использует усовершенствованные методы шифрования, которые были введены в .NET Framework 2.0 SP2. Используйте это значение для всех серверов в веб-ферме, если все серверы имеют .NET Framework 2.0 SP2 или новее, но хотя бы один не имеет .NET Framework 4.5.
Framework45. Учитываются криптографические улучшения для ASP.NET 4.5. Это значение по умолчанию, если в файле Web.config приложения атрибут targetFramework элемента httpRuntime установлен на "4.5".
В C# в чем разница между public, private, protected и отсутствием модификатора доступа?
Не удается обновить EntitySet: определен DefiningQuery, но отсутствует элемент <UpdateFunction>
Лучшая настройка непрерывной интеграции для одиночного разработчика (.NET) [закрыт]
Как запустить модульные тесты на платформе x64?
Использование номера версии веб-приложения из сборки (ASP.NET/C#)