0

"Ошибка при выполнении криптографической операции при расшифровке cookie Forms"

10

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

Я провел некоторые исследования и обнаружил, что куки формальной аутентификации связаны с 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 ответ(ов)

0

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

0

Для тех, кто еще не решил свою проблему: у меня не хватало раздела "machineKey" для шифрования/расшифрования в файле web.config.

0

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

catch (CryptographicException cex)
{
    FormsAuthentication.SignOut();
}

В этом коде, при возникновении исключения CryptographicException, происходит выход из текущей аутентификации, что позволяет пользователю снова войти в систему и получить действительный cookie.

0

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

Чтобы установить ключ машины в IIS, выполните следующие шаги:

  1. Перейдите в ваше приложение.
  2. Выберите "Machine Keys".
  3. Нажмите "Generate Keys".
0

Я столкнулся с этой проблемой, когда пытался расшифровать 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".

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь