トークンの逆シリアル化中に例外がスローされました。偽造防止トークンを.NetCore2.2アプリケーションで復号化できませんでした。
ログにエラーが表示されます。私は一日のほとんどを解決策を見つけることに費やしましたが、私の要件を満たすものを見つけることができませんでした。
これがログエラーです
重大度= [エラー]、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)
{
回答
場合
- アプリは複数のサーバーでホストされています
- 共有データ保護を構成していません
- スティッキーセッションを使用していません
これは、ユーザーがサーバーAからフォームを含むページを要求し、後でサーバーBにフォームを送信したときに発生します。
次の場合は、単一のIISサーバーでも発生する可能性があります。
- ユーザーがフォーム付きのページをリクエストする
- サーバーを再起動します
- ユーザーがフォームを送信する
これは、再起動すると新しいキーリングがメモリに読み込まれ、フォーム内の偽造防止キーが検証されなくなるためです。
後者の場合は、アプリプールの「ユーザープロファイルの読み込み」をチェックすることでIISで修正できます。
より詳しい情報: https://docs.microsoft.com/en-us/aspnet/core/security/data-protection/configuration/overview?view=aspnetcore-3.1