私は JSON ベースの AJAX リクエストを作成しています。MVC コントローラーを使用して、Phil Haack のAJAX による CSRF の防止と、Johan Driessen のMVC 4 RC 用の最新の Anti-XSRF に非常に感謝しています。しかし、API 中心のコントローラーを Web API に移行すると、2 つのアプローチの機能が著しく異なり、CSRF コードを移行できないという問題が発生します。
ScottS は最近、同様の質問を提起し、 Darin Dimitrovが回答しました。Darin のソリューションには、AntiForgery.Validate を呼び出す承認フィルターの実装が含まれます。残念ながら、このコードは私には機能しません (次の段落を参照)。正直なところ、私には高度すぎます。
私が理解しているように、Phil のソリューションは、フォーム要素がない場合に JSON リクエストを行う際の MVC AntiForgery の問題を克服します。フォーム要素は、AntiForgery.Validate メソッドによって想定/期待されます。これが、私が Darin のソリューションにも問題を抱えている理由だと思います。HttpAntiForgeryException 「必要な偽造防止フォーム フィールド '__RequestVerificationToken' が存在しません」を受け取りました。トークンが POST されていることは確かです (ただし、Phil Haack のソリューションのヘッダーにあります)。クライアントの呼び出しのスナップショットを次に示します。
$token = $('input[name=""__RequestVerificationToken""]').val();
$.ajax({
url:/api/states",
type: "POST",
dataType: "json",
contentType: "application/json: charset=utf-8",
headers: { __RequestVerificationToken: $token }
}).done(function (json) {
...
});
Johan のソリューションと Darin のソリューションを組み合わせてハックを試みましたが、機能するようになりましたが、HttpContext.Current を導入しています。
これが私の洗練されていないマッシュアップです..変更は、try ブロックの 2 行です。
public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, Func<Task<HttpResponseMessage>> continuation)
{
try
{
var cookie = HttpContext.Current.Request.Cookies[AntiForgeryConfig.CookieName];
AntiForgery.Validate(cookie != null ? cookie.Value : null, HttpContext.Current.Request.Headers["__RequestVerificationToken"]);
}
catch
{
actionContext.Response = new HttpResponseMessage
{
StatusCode = HttpStatusCode.Forbidden,
RequestMessage = actionContext.ControllerContext.Request
};
return FromResult(actionContext.Response);
}
return continuation();
}
私の質問は次のとおりです。
- Darin のソリューションは、フォーム要素の存在を前提としていると考えるのは正しいですか?
- Darin の Web API フィルターを Johan の MVC 4 RC コードとマッシュアップするエレガントな方法は何ですか?
前もって感謝します!