토큰을 deserializing하는 동안 예외가 throw되었습니다 .An exception was thrown while deserializing the token. 위조 방지 토큰은 .Net Core 2.2 애플리케이션에서 해독 할 수 없습니다 .The antiforgery token could not be decrypted in .Net Core 2.2 application

Aug 17 2020

내 로그에 오류가 발생합니다. 나는 하루의 대부분을 솔루션을 찾는 데 보냈지 만 내 요구 사항을 충족하는 솔루션을 찾지 못했습니다.

다음은 로그 오류입니다.

심각도 = [오류], ipaddress = xxxx, subprocess = Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description = 토큰을 역 직렬화하는 동안 예외가 발생했습니다. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException : 위조 방지 토큰을 해독 할 수 없습니다. ---> System.Security.Cryptography.CryptographicException : 키 링에 {xxxxxxxxxx} 키가 없습니다. Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (Byte [] protectedData, Boolean allowOperationsOnRevokedKeys, UnprotectStatus & status)에서 Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect (ByteMigration, Boolean & ignore [] protectedData, Boolean & ignore [] protectedData, Boolean & ignore [] ) Microsoft.AspNetCore.DataProtection.KeyManagement.Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize (String serializedToken)의 KeyRingBasedDataProtector.Unprotect (Byte [] protectedData) at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Antiforgery.AspNetCore.Deserialize (String serializedToken) 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)
    {

답변

4 RoarS. Aug 17 2020 at 10:25

만약

  • 앱이 여러 서버에서 호스팅 됨
  • 공유 데이터 보호를 구성하지 않았습니다.
  • 고정 세션을 사용하지 않습니다.

이것은 사용자가 서버 A에서 양식이있는 페이지를 요청하고 나중에 양식을 서버 B로 제출할 때 발생합니다.

다음과 같은 경우 단일 IIS 서버에서도 발생할 수 있습니다.

  • 사용자가 양식이있는 페이지를 요청
  • 서버를 다시 시작합니다
  • 사용자가 양식을 제출

그 이유는 다시 시작하면 새 키링이 메모리에로드되고 양식 내의 위조 방지 키가 더 이상 유효성을 검사하지 않기 때문입니다.

후자의 경우는 응용 프로그램 풀에서 "사용자 프로필로드"를 확인하여 IIS에서 수정할 수 있습니다.

더 많은 정보: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1