Fehlermeldung "The antiforgery token could not be decrypted"

Fehlerbeschreibung

In einer ASP.NET-Core-Anwendung erhalte ich sporadisch diese Fehlermeldung:

Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery: An exception was thrown while deserializing the token.

The key {2a35e288-c14f-405b-b1d4-d94e2ee2587e} was not found in the key ring.

Vollständiger Ausschnitt:

2021-03-08 15:00:48 ERROR Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery: An exception was thrown while deserializing the token.
*************************
Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException
-------------------------
The antiforgery token could not be decrypted.
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)
   at Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery.GetCookieTokenDoesNotThrow(HttpContext httpContext)

-------------------------
System.Security.Cryptography.CryptographicException
-------------------------
The key {2a35e288-c14f-405b-b1d4-d94e2ee2587e} was not found in the key ring.
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore(Byte[] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus& status)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte[] protectedData, Boolean ignoreRevocationErrors, Boolean& requiresMigration, Boolean& wasRevoked)
   at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect(Byte[] protectedData)

Ursachenforschung

Es ist mir nicht ganz klar, was da vor sich geht.

Zunächst dachte ich, es liegt an dem hier:

Doch der Fehler trat ja nicht dauerhaft, sondern nur sporadisch auf.

Ursache

Ich habe dann weiter geforscht und in der Windows-Ereignisanzeige auf dem Server einen Eintrag gefunden:

2021-03-08 14:54:57 Application 'C:\inetpub\MyApp\' started successfully.

Der ursprüngliche Fehler trat laut Protokoll um 15 Uhr auf.

Nach Rücksprache mit dem Anwender hat er ca. 10 Minuten gebraucht, um das Formular auszufüllen.

Deshalb habe ich mir den Ablauf so zusammen gereimt:

  1. 14:50 Uhr: Kunde beginnt das Formular aufzurufen und auszufüllen.
  2. 14:54 Uhr: Aus irgend einem Grund wird der Application-Pool recyclet (siehe Eintrag im Ereignisprotokoll)
  3. 15:00 Uhr: Kunde ist fertig und will das Formular absenden.

Ergebnis: Boom!

Der App-Pool ist weg, und anscheinend auch das Anti-Forgery-Token.

Ich bin mir nicht ganz sicher, warum der Application-Pool neu gestartet ist.

Lösung

Was ich jetzt mache:

  • Das „Load User Profile“ auf „true“ stellen, so wie hier beschrieben.
  • Schaue, ob ich noch was am Data Protection konfigurieren kann.

Gute Tipps finden sich auch in diesem Artikel:

Why is the IIS default app pool recycle set to 1740 minutes?

U. a.:

  • „Recycling → Regular Time Intervals“ von 1740 auf 0 stellen
  • Stattdessen weiter unten bei „Recycling → Specific Times“ eine Uhrzeit wie z. B. „01:00:00“ eintragen
  • „Process Model → Idle Time-out (minutes)“ auf 0 stellen