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