Pengecualian diberikan saat deserialisasi token. Token antiforgery tidak dapat didekripsi dalam aplikasi .Net Core 2.2

Aug 17 2020

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

4 RoarS. Aug 17 2020 at 10:25

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