背景#
現代の ASP.NET Core アプリケーションでは、デフォルトで Anti Forgery Token 検証が有効になっています。
ABP の Web アプリケーションを起動し、nginx を逆プロキシとして使用し、SSL を設定しました。
ページ上で生成された ajax の投稿リクエストは直接エラーが発生し、302 のリダイレクトがエラーページに転送されます:
問題のトラブルシューティング#
次に、jQuery でラップされたajax
または ABP のDynamic JavaScript API Client Proxiesを使用してajax
リクエストを送信すると、アプリケーションの起動コンソールに次のメッセージが表示されます:
[11:18:11 WRN] The required antiforgery request token was not provided in either form field "__RequestVerificationToken" or header value "RequestVerificationToken".
また、ajax リクエストのレスポンスが 302 のリダイレクトでエラーページになることもわかります。
コンソールのメッセージは明確であり、トークンの値がフォームフィールド "__RequestVerificationToken" またはヘッダー値 "RequestVerificationToken" のいずれにも提供されていないことを示しています。そのため、トークンの値がどこから取得されるかを知る必要があります。ソースコードを確認すると、次の取得方法が見つかります:
abp.utils.getCookieValue(abp.security.antiForgery.tokenCookieName)
つまり、cookie からキーが「'XSRF-TOKEN'」の値を取得する必要がありますが、コンソールで実行すると、取得される値が「null」であることがわかります。ただし、ブラウザの cookie テーブルでは「'XSRF-TOKEN'」が表示されますが、マウスを重ねると次のようなメッセージが表示されます:
簡単に言えば、この cookie は設定されているものの、Secure の問題が存在し、ブラウザによってブロックされているため、設定されていないのと同じです。したがって、JavaScript では値を取得できず、ajax リクエストがトークンの値を持たないまま送信されます。そのため、abp サーバーはトークンの値を検証できず、直接エラーページにリダイレクトされます。
解決策#
Web プロジェクトの?WebModule
ファイルを開き、次のコードを追加します:
public override void ConfigureServices(ServiceConfigurationContext context)
{
ConfigureAntiForgery();
}
private void ConfigureAntiForgery()
{
Configure<AbpAntiForgeryOptions>(options =>
{
options.TokenCookie.SecurePolicy = CookieSecurePolicy.Always;
});
}