ASP.NET Core ファイルアップロードをマルチパートから読み取るときのクロスサイト要求偽造の検証

オウルです。

ASP.NET Coreでファイルアップロードマルチパートから読み取る場合、formタグで自動生成された偽造防止トークンValidateAntiForgeryTokenフィルターで処理するとエラーになります。このエラーの解決策の1つとしてCookieのヘッダーから偽造防止トークンを読み取る方法を紹介します。

ローカル環境
WSL v1 Ubuntu18.04 LTS
App ASP.NET Core 3.1.302

Ubuntu18.04 LTSでのASP.NET Coreの開発環境は、こちらをご参照ください。

ファイルアップロード

Javascriptを使用してファイルをコントローラーのアクションにストリーミングします。アクションでは、マルチパートセクションを読み取りアップロードされたファイルを処理します。ここでは、formタグ内にはinput type=”file”要素のみとします。

Uploadアクション

Uploadアクションは、公式のストリーミングを使用して大きいファイルをアップロードするを参考にしています。モデルバインドを使用せず、Requestを参照して処理します。

例外発生

UploadアクションにJavascriptからアクセスするとawait reader.ReadNextSectionAsync()で次の例外が発生します。

このエラーを解決するために、まずは偽造防止オプションを見直します。

偽造防止オプション

通常、formタグのmethodがGETでない場合、既定で偽造防止トークンを生成します。そして、POSTの場合、その偽造防止トークンはBodyに含まれます。偽造防止トークンをヘッダーに格納するために、Startup.ConfigureServicesの偽造防止オプションをカスタマイズします。

Startup.ConfigureServices

Cookieに偽造防止トークンを設定

偽造防止トークンを生成してCookieに設定するフィルター属性をストリーミングを使用して大きいファイルをアップロードするを参考に作成します。

フィルター属性を作成

ActionResultオブジェクトが実行される前にCookieに偽造防止トークンを設定します。

フィルター属性を指定

GenerateAntiforgeryTokenCookieAttributeをビューアクションに指定します。

Javascriptで偽造防止トークンを送信

次にUploadアクションにアクセスするクライアントの実装です。

偽造防止トークンの自動生成を無効

asp-antiforgery=”false”をformタグに追加して偽造防止トークンを明示的に無効にします。

偽造防止トークンの送信

クライアントの実装(TypeScript)は、分かり易くfetch部分のみを抜粋します。

これで、Javascriptからアクセスすると偽造防止トークンの検証、Updateアクションが処理されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA