myesn

myEsn2E9

hi
github

ABP: nginxを介して起動後、ページ上のajax POSTリクエストは302リダイレクトでエラーページに転送されます。

背景#

現代の ASP.NET Core アプリケーションでは、デフォルトで Anti Forgery Token 検証が有効になっています。

ABP の Web アプリケーションを起動し、nginx を逆プロキシとして使用し、SSL を設定しました。

ページ上で生成された ajax の投稿リクエストは直接エラーが発生し、302 のリダイレクトがエラーページに転送されます:
image

問題のトラブルシューティング#

次に、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'」が表示されますが、マウスを重ねると次のようなメッセージが表示されます:
image

簡単に言えば、この 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;
    });
}

参考#

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。