Uma exceção foi lançada ao desserializar o token. O token antifalsificação não pôde ser descriptografado no aplicativo .Net Core 2.2

Aug 17 2020

Estou recebendo o erro no meu log. Passei a maior parte do dia procurando a solução, mas não consegui encontrar aquela que atendesse às minhas necessidades.

Aqui está o erro de registro

gravity=[ERRO], ipaddress=xxxx, subprocess=Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description=Uma exceção foi lançada durante a desserialização do token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: o token antifalsificação não pôde ser descriptografado. ---> System.Security.Cryptography.CryptographicException: A chave {xxxxxxxxx} não foi encontrada no chaveiro. em Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status) em Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean&revoeanMigration wasked ) em 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)
    {

Respostas

4 RoarS. Aug 17 2020 at 10:25

Se

  • seu aplicativo está hospedado em vários servidores
  • não configurou a proteção de dados compartilhados
  • você não está usando sticky sessions

isso acontecerá quando o usuário solicitar uma página com um formulário do servidor A e, posteriormente, enviar o formulário ao servidor B.

Também pode acontecer em um único servidor IIS se

  • usuário solicita uma página com um formulário
  • você reinicia o servidor
  • usuário envia o formulário

A razão para isso é que uma reinicialização faz com que um novo chaveiro seja carregado na memória e a chave antifalsificação dentro do formulário não seja mais válida.

O último caso pode ser corrigido no IIS marcando "carregar perfil do usuário" no pool de aplicativos.

Mais informações:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1