私のASP.Net Core MVCアプリケーションには、以下のようなAntiforgeryミドルウェアが追加されています。
startup.cs
services.AddMvc();
services.AddSession();
services.AddCaching();
services.AddSession(o =>
{
o.IdleTimeout = TimeSpan.FromMinutes(120);
});
services.AddAntiforgery();
ビューとコントローラーに以下を追加しました
表示:
<form action="/Home/Login" method="post" id="staff-login" autocomplete="off">
@Html.AntiForgeryToken()
......
コントローラ
[HttpPost, ValidateAntiForgeryToken]
public IActionResult Login(IFormCollection formCollection)
{...}
問題は、ユーザーがさまざまなフォームに出くわすと、ユーザーが常に下になることです。
System.InvalidOperationException:偽造防止トークンを復号化できませんでした。 ---> System.Security.Cryptography.CryptographicException:キー{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}がキーリングに見つかりませんでした。
検証/復号化キーの静的ペアをweb.configに設定することを提案する解決策を見つけましたが、この解決策は古典的なasp.netアプリケーション専用です。 ASP.Netコアではどうすればよいですか?
LinuxコンテナーでホストされているASP .netコアアプリで正確にそのエラーが発生しました。
docs から、特定の基準を満たさない場合、キーはプロセス内でのみ永続化されるように見えますが、それでも私にとっては機能しませんでした。
最初に、デフォルトのセットアップでエラーが発生しました。
次に、ファイルシステムのキーに特定の構成を追加しました。
services.AddDataProtection()
.PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/my-af-keys/"));
これでも、アプリケーション名を設定する必要があった問題は解決しませんでした。
services.AddDataProtection()
.SetApplicationName("fow-customer-portal")
.PersistKeysToFileSystem(new System.IO.DirectoryInfo(@"/var/dpkeys/"));
まだ確認していませんが、LXCホスティングの性質上、.netコアはアプリのIDを保持できません。
Localhostポートでアプリケーションの使用を開始し、同じポートのdockerで使用しようとしたため、これが発生しました。それまでに、自分のマシンで生成されたキーを指定するCookieがあったため、Dockerでは機能しませんでした。
TL; DR他のマシンからそのドメイン/ポートを使用したことがある場合は、Cookieをクリアします。