トークンの逆シリアル化中に例外がスローされました。偽造防止トークンを.NetCore2.2アプリケーションで復号化できませんでした。

Aug 17 2020

ログにエラーが表示されます。私は一日のほとんどを解決策を見つけることに費やしましたが、私の要件を満たすものを見つけることができませんでした。

これがログエラーです

重大度= [エラー]、ipaddress = xxxx、サブプロセス= 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)at Microsoft.AspNetCore.DataProtection.KeyManagement.KeyRingBasedDataProtector.DangerousUnprotect(Byte [] protectedData、Boolean ignoreRevocationErrors、Boolean )Microsoft.AspNetCore.DataProtection.KeyManagementで。KeyRingBasedDataProtector.Unprotect(Byte [] protectedData)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)at Microsoft.AspNetCore.Antiforgery.Internal.DefaultAntiforgeryTokenSerializer.Deserialize(String serializedToken)at Microsoft.AspNet 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