c# asp.net .net cryptographicexception

c# - “Se produjo un error durante una operación criptográfica” al descifrar la cookie de formularios



asp.net .net (12)

Subí mi sitio web a un alojamiento web y surgió este error;
'' Ocurrió un error durante una operación criptográfica ''.

He investigado un poco y parece que la cookie autenticada de forma está vinculada a MachineKey (que difiere cuando se utiliza el host web).


He encontrado un método que debería solucionar este problema pero el error permanece.

CÓDIGO:

/// <summary> /// This method removes a cookie if the machine key is different than the one that saved the cookie; /// </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(); } }


APILACIÓN:

[CryptographicException: Error occurred during a cryptographic operation.] 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


Acabo de tener esto también, borré las entradas de la tabla UserTokenCaches de la base de datos.


Esto se debe a que falta la clave de la máquina, que se utiliza como una clave simétrica para realizar el cifrado y el descifrado.

Para configurar la máquina en el IIS;

Vaya a su aplicación -> Claves de la máquina -> Generar claves


Me encontré con este problema cuando intenté tomar una cookie de autenticación de formularios creada por una aplicación ASP.NET 2.0 y descifrarla dentro de un proyecto de API Web .NET4.5. La solución fue agregar un atributo llamado "compatibodeMode" al nodo "machineKey" dentro del archivo web.config de mi api de web:

<machineKey ... compatibilityMode="Framework20SP2"/>

Documentación: https://msdn.microsoft.com/en-us/library/system.web.configuration.machinekeysection.compatibilitymode.aspx

Y desde el documento, aquí están los valores permitidos para ese atributo:

  • Framework20SP1 . Este valor especifica que ASP.NET utiliza métodos de cifrado que estaban disponibles en versiones de ASP.NET anteriores a 2.0 SP2. Use este valor para todos los servidores en una granja de servidores web si algún servidor tiene una versión de .NET Framework anterior a 2.0 SP2. Este es el valor predeterminado a menos que el archivo web.config de la aplicación tenga el atributo targetFramework del elemento httpRuntime establecido en "4.5".
  • Framework20SP2 . Este valor especifica que ASP.NET utiliza métodos de cifrado actualizados que se introdujeron en .NET Framework 2.0 SP2. Use este valor para todos los servidores en una granja de servidores web si todos los servidores tienen .NET Framework 2.0 SP2 o posterior, pero al menos uno no tiene .NET Framework 4.5.
  • Marco45 . Las mejoras criptográficas para ASP.NET 4.5 están vigentes. Este es el valor predeterminado si el archivo web.config de la aplicación tiene el atributo targetFramework del elemento httpRuntime establecido en "4.5".

Me enfrenté al mismo problema. Acabo de borrar todas las cookies y datos de caché del navegador y se solucionó. Espero que también funcione para usted.


Otra opción es borrar las cookies de la configuración del navegador y esto permite que se almacenen nuevas cookies.


Para cualquier persona que no haya resuelto su problema, me faltaba la entrada "machineKey" para cifrar / descifrar en mi web.config


Recibía errores criptográficos al validar el token de AntiForgery.

Creo que fue porque acabo de hacer algunos cambios de configuración de control de seguridad en mi servidor para configurar el reciclaje de la aplicación para reciclar cuando los límites de la Memoria Virtual alcanzan los 1,000,000 Kilobytes.

Esto fue definitivamente demasiado poco para el reciclaje de la memoria virtual. El uso de la memoria privada se puede establecer en 1,000,000 KB, pero la memoria virtual debe tener mucho más espacio.

Noté que mi aplicación estaba reciclando con demasiada frecuencia.

Aumenté el límite de memoria virtual a 10,000,000 KB y esos errores desaparecieron. Creo que el grupo de aplicaciones pudo haber estado reciclando cuando estaba llenando el formulario.


Si está utilizando formularios de autenticación. puede cerrar sesión cuando detecte la excepción y permita a sus usuarios iniciar sesión y crear una cookie válida

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



También he experimentado esto al desarrollar una nueva solución y ejecutar el sitio web en localhost. Establecer la clave de la máquina no hizo ninguna diferencia, sino que simplemente eliminar todas las cookies para localhost solucionó el problema.


Tuve el mismo problema: MVC 5 ASP.Net Web Application .net Framework 4.6.1

Solución:

  1. Ir a la carpeta App_Data (Explorador de soluciones)
  2. Haga doble clic en su NAME.mdf (esta acción abre la pestaña Explorador del servidor)
  3. Haga clic derecho en la tabla UserTokenCaches y vea Mostrar datos de tabla
  4. Borrar la fila
  5. Ejecutar la aplicación de nuevo y todo estará bien

protected void Application_Error(object sender_, CommandEventArgs e_) { Exception exception = Server.GetLastError(); if(exception is CryptographicException) { FormsAuthentication.SignOut(); } }

en su Global.asax.cs, en Catching errors in Global.asax , siempre y cuando use la autenticación de Formularios (nombre de usuario / contraseña). Trabajó para mi.