Pengecualian diberikan saat deserialisasi token. Token antiforgery tidak dapat didekripsi dalam aplikasi .Net Core 2.2
Saya mendapatkan kesalahan di log saya. Saya menghabiskan sebagian besar hari saya mencari solusi tetapi tidak dapat menemukan solusi yang memenuhi kebutuhan saya.
Inilah kesalahan lognya
severity = [ERROR], ipaddress = xxxx, subprocess = Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description = Pengecualian dilemparkan saat menonaktifkan token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: Token antiforgery tidak dapat didekripsi. ---> System.Security.Cryptography.CryptographicException: Kunci {xxxxxxxxxx} tidak ditemukan di key ring. di Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (Byte [] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus & status) di Microsoft.AspNetCore.DataProtection.KeyrotectData ) di Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect (Byte [] protectedData) di Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize (String serializedToken) di Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize DefaultAntiforgery.GetCookieTokenDoesNotThrow (HttpContext httpContext)
"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)
{
Jawaban
Jika
- aplikasi Anda dihosting di beberapa server
- belum mengonfigurasi perlindungan data bersama
- Anda tidak menggunakan sesi lengket
ini akan terjadi ketika pengguna meminta halaman dengan formulir dari server A, dan kemudian mengirimkan formulir ke server B.
Ini juga dapat terjadi pada satu server IIS jika
- pengguna meminta halaman dengan formulir
- Anda me-restart server
- pengguna mengirimkan formulir
Alasan untuk ini adalah bahwa restart menyebabkan keyring baru dimuat ke dalam memori, dan kunci antiforgery di dalam formulir tidak lagi divalidasi.
Kasus terakhir dapat diperbaiki di IIS dengan memeriksa "muat profil pengguna" di pool aplikasi.
Info lebih lanjut: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1