web-dev-qa-db-ja.com

ASP.NET CoreでAntiforgeryを使用してエラーが発生しました-偽造防止トークンを復号化できませんでした

私の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コアではどうすればよいですか?

8
seanbun

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を保持できません。

12
ScottC

Localhostポートでアプリケーションの使用を開始し、同じポートのdockerで使用しようとしたため、これが発生しました。それまでに、自分のマシンで生成されたキーを指定するCookieがあったため、Dockerでは機能しませんでした。

TL; DR他のマシンからそのドメイン/ポートを使用したことがある場合は、Cookieをクリアします。

1
Stefano