Une exception a été levée lors de la désérialisation du jeton. Le jeton anti-contrefaçon n'a pas pu être déchiffré dans l'application .Net Core 2.2

Aug 17 2020

Je reçois l'erreur dans mon journal. J'ai passé la majeure partie de ma journée à trouver la solution mais je n'ai pas pu trouver celle qui répondait à mes besoins.

Voici l'erreur du journal

gravité=[ERREUR], ipaddress=xxxx, subprocess=Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description=Une exception a été levée lors de la désérialisation du jeton. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException : le jeton anti-contrefaçon n'a pas pu être déchiffré. ---> System.Security.Cryptography.CryptographicException : la clé {xxxxxxxxxx} n'a pas été trouvée dans le jeu de clés. à Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status) à Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requirementsMigration, Boolean& wasRevoked ) sur 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)
    {

Réponses

4 RoarS. Aug 17 2020 at 10:25

Si

  • votre application est hébergée sur plusieurs serveurs
  • n'a pas configuré la protection des données partagées
  • vous n'utilisez pas de sessions permanentes

cela se produira lorsque l'utilisateur demandera une page avec un formulaire au serveur A, puis soumettra le formulaire au serveur B.

Cela peut également se produire sur un seul serveur IIS si

  • l'utilisateur demande une page avec un formulaire
  • tu redémarres le serveur
  • l'utilisateur soumet le formulaire

La raison en est qu'un redémarrage entraîne le chargement d'un nouveau trousseau de clés en mémoire et que la clé anti-contrefaçon à l'intérieur du formulaire n'est plus validée.

Ce dernier cas peut être corrigé dans IIS en cochant "charger le profil utilisateur" dans le pool d'applications.

Plus d'informations:https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1