Токен защиты от подделки ajax json

Я защищаю свое приложение от межсайтовых сценариев, используя маркер защиты от подделки. Среда разработки: VS 2012, MVC4, нокаут.

Я разместил токен защиты от подделки следующим образом

<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>  

В моем вызове ajax я также хочу отправить данные. Мой вызов ajax выглядит следующим образом

            $.ajax({
                url: VirtualDir + '/Tasks/StartTask/',
                asynch: false,
                type: 'POST',
                data: { "__RequestVerificationToken": token, oTaskData: JSON.stringify(item), whichTab: self.CurrentTab },
                success: function (data) {
                    InitializeData(data);
                    self.LoadData(data);
                }
            })
        };

Мой код контроллера выглядит следующим образом

    [ValidateAntiForgeryToken]
    [Authorize]
    public JsonResult StartTask(TaskData oTaskData, string whichTab)
    {
        int TaskID = oTaskData.TaskID;
        int LoggedInEmployeeID = Convert.ToInt32(System.Web.HttpContext.Current.Session["EmployeeID"]);
        TaskRepository oTaskRepository = new TaskRepository();
        return Json(oTaskRepository.TaskChangeStatus(TaskID, LoggedInEmployeeID, TaskConstants.IN_PROGRESS, whichTab), JsonRequestBehavior.AllowGet);
    }

В контроллере значение параметра whichTab получено, но oTaskData равно null. Если я удалю токен защиты от подделки, данные будут правильно получены в контроллере.

Как я могу использовать токен защиты от подделки вместе с данными JSON?


person user3357040    schedule 10.03.2015    source источник
comment
Дубликат: stackoverflow.com/questions/2906754/   -  person Dawood Awan    schedule 10.03.2015
comment
В вашем методе отсутствует атрибут [HttpPost].   -  person Dawood Awan    schedule 10.03.2015
comment
Я уже проверил этот вопрос. Разница в том, что в этом примере передается только один параметр типа int. В моем случае я отправляю объект.   -  person user3357040    schedule 10.03.2015
comment
Он не работает даже после добавления [HttpPost]   -  person user3357040    schedule 10.03.2015


Ответы (1)


При отправке нескольких значений в формате JSON. У вас есть stringify следующим образом:

Я отделяю строку JSON от запроса Ajax, чтобы было понятно.

    var sData = JSON.stringify({
       __RequestVerificationToken : token,
       oTaskData: item,
       whichTab: self.CurrentTab
    });   

В запросе Ajax добавьте это: contentType: 'application/json', чтобы показать, что вы отправляете данные Json.

а вы возвращаете Json, так еще и dataType: 'json'

 $.ajax({
      url: VirtualDir + '/Tasks/StartTask/',
      asynch: false,
      type: 'POST',
      data: sData,
      contentType: 'application/json',
      dataType: 'json'
                success: function (data) {
                    InitializeData(data);
                    self.LoadData(data);
                }
            });

ИЗМЕНИТЬ:

Если вышеуказанное не работает, используйте ответ здесь: используйте ЗАГОЛОВОК запроса Ajax.

https://stackoverflow.com/a/24394578/1910735

var headers = {};
headers['__RequestVerificationToken'] = token;

$.ajax({
    type: 'POST',
    url: '/MyTestMethod',
    contentType: 'application/json; charset=utf-8',
    headers: headers,
    data: JSON.stringify({
         oTaskData: item,
           whichTab: self.CurrentTab
    }),
    dataType: "json",
    success: function () {},
    error: function (xhr) {}
});

Вам нужно будет создать этот класс атрибутов: ValidateJsonAntiForgeryTokenAttribute, вы можете увидеть в ответе: https://stackoverflow.com/a/24394578/1910735

person Dawood Awan    schedule 10.03.2015
comment
Он даже не собирается управлять - person user3357040; 12.03.2015
comment
У вас есть атрибут [HttpPost] для вашего метода в контроллере? - person Dawood Awan; 12.03.2015