При десериализации токена возникла исключительная ситуация. Токен защиты от подделки не может быть расшифрован в приложении .Net Core 2.2.

Aug 17 2020

Я получаю сообщение об ошибке в моем журнале. Я потратил большую часть своего дня на поиски решения, но не смог найти то, которое соответствует моим требованиям.

Вот ошибка журнала

severity = [ERROR], ipaddress = xxxx, subprocess = Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgery, description = Исключение при десериализации токена. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: не удалось расшифровать маркер защиты от подделки. ---> System.Security.Cryptography.CryptographicException: ключ {xxxxxxxxxx} не найден в связке ключей. на Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.UnprotectCore (байт [] protectedData, булевой allowOperationsOnRevokedKeys, UnprotectStatus и статус) в Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect (байт [] protectedData, Boolean, Boolean ignoreRevocationErrors & requiresMigration, Boolean & wasRevoked ) в Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.Unprotect (Byte [] protectedData) в Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize (String serializedToken) в Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokerity.Internal.DefaultAntiforgeryTokerry 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