ASP.NET核心在json post请求正文

时间:2017-06-19 16:05:32

标签: c# jquery ajax asp.net-core asp.net-core-mvc

好吧,我有一个通过表单tagHelper呈现的表单。所以它包括特殊隐藏的防伪标记。

我正在尝试发送以下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)
 {
    ...
 }

因此,后期数据包括防伪令牌的密钥,但请求仍未通过防伪验证并因错误而失败。如果我从控制器中删除防伪验证属性而不是完美的工作。

为什么不检查请求体内的令牌 - 是设计还是某种问题?

2 个答案:

答案 0 :(得分: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(); }
});

答案 1 :(得分:0)

您可以像下面那样传递“标题”。

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

引用:https://api.jquery.com/jQuery.ajax/