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
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
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