2017-06-19 16 views
3

さて、フォームtagHelperでレンダリングされたフォームがあります。だから、偽造防止トークンのための特別な隠しが含まれています。json post request bodyのASP.NETコアパスantiforgerytoken

と私は次のAjaxリクエスト送信しようとしています:

var data = JSON.stringify(feedbackForm.serializeArray().reduce((res, item) => { 
     res[item.name] = item.value; 
     return res; }, {})); 
// data example: '{"Description":"some description", "__RequestVerificationToken":"CfDJ8F9f8kTKlVNEsnTxejQIJ__pRCl2CuZTQDVAY2216J7GgHWGDC0XUMPc0FKHpr_K5uhz8Kx0VeHDkIPdQ3V0Xur9oLE2u_bpfXuVss6AWX3BVh0WbwfQriaibOrf_yvEuIYZV-jHU_G-AHPD91cKz_QE7MVmeLVgTum80yTb8biGctMtJcU67Wp7ZgN86yMuew"}'` 
    $.ajax({ 
     type: "POST", 
     url: '@Url.Action("Feedback", "Profile", new {Area = ""})', 
     contentType: "application/json; charset=utf-8", 
     data: data, 
     dataType: "json" 
    }); 

はそのように見える行動をコントローラにする:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Feedback([FromBody]FeedbackViewModel vm) 
{ 
    ... 
} 

ので、まだ、データがantiforgeryトークンのキーが含まれるが、要求をしませポスト偽造防止妥当性検査をパスし、エラーで失敗しました。コントローラから偽造防止の検証属性を削除すると、それは完全に機能します。

リクエストボディの内部でトークンをチェックしないのはなぜですか?それは設計上の問題なのですか、それとも何らかの問題ですか?

+0

[ASP.NETコアとjQueryを使ってAntiforgeryトークンを有効にする](https://stackoverflow.com/questions/40530474/enable-antiforgery-token-with-asp-net-core-and-の可能性のある重複jquery) –

+0

さて、実装をヘッダーに変更したくないので、なぜリクエストボディで動作しないのかを知りたいのですが。 –

+0

私は最近、IIRCと同様の仕事をしてきました。ヘッダーとデータ要素が一致する必要があります。 –

答えて

0

次のように実装できますか。

data["__RequestVerificationToken"] = $('[name=__RequestVerificationToken]').val(); 
var data = JSON.stringify(feedbackForm.serializeArray().reduce((res, item) => { 
    res[item.name] = item.value; 
    return res; }, {})); 

$.ajax({ 
    url: '@Url.Action("Feedback", "Profile", new {Area = ""})', 
    contentType: "application/json" 
    type: 'POST', 
    context: document.body, 
    data: data, 
    success: function() { refresh(); } 
}); 
+0

私の場合、BLOBを掲示しているので、jsonとして送信する必要があります.URLコード化されたデータに対して許可された要求よりも大きいです。 –

+0

@silent_coder jsonのコンテンツタイプで回答を更新しました。 – hasan