私はJSONベースのAJAXリクエストを作成していますが、MVCコントローラはPhil HaackにPreventing CSRF with AJAXとJohan DriessenのUpdated Anti-XSRF for MVC 4 RCに対して非常に感謝しています。しかし、API中心のコントローラーをWeb APIに移行すると、2つのアプローチ間の機能が著しく異なり、CSRFコードを移行できない問題が発生しています。MVCでWeb APIのValidatingAntiForgeryToken属性を実装する際の問題4 RC
ScottSは最近、同様のquestionを提出しました。これはDarin Dimitrovによってansweredでした。 Darinのソリューションには、AntiForgery.Validateを呼び出す認証フィルタを実装することが含まれます。残念ながら、このコードは私のためには機能しません(次の段落を参照してください)。そして、正直なところ、私にとっては高度です。
私が理解しているように、Philのソリューションは、フォーム要素がなくてもJSON要求を行うときにMVC AntiForgeryの問題を克服します。フォーム要素は、AntiForgery.Validateメソッドによって想定/予期されます。私これは私もダーリンのソリューションに問題があるかもしれないと信じている。私はHttpAntiForgeryExceptionを受け取る "必要な偽造防止フォームフィールド '__RequestVerificationToken'が存在しない。私はトークンがPOSTされていることを確信しています(Phil Haackの解決策のヘッダーにもかかわらず)。ここでは、クライアントのコールのスナップショットがあります:私は一緒にダーリンさんとヨハンのソリューションを叩解してハックを試してみましたが、作業のものを得ることができたが、私はなぜこれが安全な/適切であるかどうかわからない、HttpContext.Current導入しています
$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) {
...
});
提供されたHttpActionContextを使用することはできません。変更は、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();
}
私の質問は以下のとおりです。
- 私はダーリンのソリューションが想定する考えで正しいアムフォーム要素の存在?
- JohanのMVC 4 RCコードでDarinのWeb APIフィルタをマッシュアップするには、どのような方法がありますか?
ありがとうございます!
FromResultは何ですか? –