Se lanzó una excepción al deserializar el token. El token antifalsificación no se pudo descifrar en la aplicación .Net Core 2.2

Aug 17 2020

Recibo el error en mi registro. Pasé la mayor parte de mi día buscando la solución, pero no pude encontrar la que cumpliera con mis requisitos.

Aquí está el error de registro

severidad=[ERROR], ipaddress=xxxx, subprocess=Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description=Se generó una excepción al deserializar el token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: no se pudo descifrar el token antifalsificación. ---> System.Security.Cryptography.CryptographicException: la clave {xxxxxxxxxx} no se encontró en el conjunto de claves. en Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status) en Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocacionErrors, BookedRevolean&requiere wasMigration, BookedRevole ) en Microsoft.AspNetCore.DataProtection.KeyManagement.

    "Certificates": {
    "StoreName": "My",
    "StoreLocation": "LocalMachine"
    "SerialNumber": "xxxxxxxxxxxx"
},
   
   private X509Certificate2 LCertificate()
    {
        var storeName = Configuration["Certificates:StoreName"];
        var storeLocation = Configuration["Certificates:StoreLocation"];
        string serialNumber = Configuration["Certificates: SerialNumber"];
        using(X509Store store = new X509Store(storeName,storeLocation))
        {
            var certificates = store.Certificates
                                    .Find(X509FindType.FindBySerialNumber,
                                          serialNumber,
                                          acceptValidCertOnly);             

            return certificates[0];
        }
    }
    
     public void ConfigureServices(IServiceCollection services)
    {
        services.AddIdentityServer
                .AddSigningCredential(new X509Certificate2(LCertificate()))
      
    }

   [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginModel model)
    {

Respuestas

4 RoarS. Aug 17 2020 at 10:25

Si

  • su aplicación está alojada en varios servidores
  • no ha configurado la protección de datos compartidos
  • no estás usando sesiones pegajosas

esto sucederá cuando el usuario solicite una página con un formulario del servidor A y luego envíe el formulario al servidor B.

También puede ocurrir en un solo servidor IIS si

  • el usuario solicita una página con un formulario
  • reinicias el servidor
  • el usuario envía el formulario

La razón de esto es que un reinicio hace que se cargue un nuevo conjunto de claves en la memoria, y la clave antifalsificación dentro del formulario ya no se valida.

El último caso se puede solucionar en IIS marcando "cargar perfil de usuario" en el grupo de aplicaciones.

Más información:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1