ajax antiforgery token json

时间:2015-03-10 10:58:00

标签: json asp.net-mvc-4 antiforgerytoken

我正在使用防伪令牌保护我的应用程序免受跨站点脚本攻击 开发环境是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数据一起使用?

1 个答案:

答案 0 :(得分:0)

在JSON中发送多个值时。你有这样的字符串化:

我将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);
                }
            });

修改

如果Above不起作用,请在此处使用Answer: 使用Ajax请求的HEADER。

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