ajax反伪造令牌json
我使用防伪令牌保护我的应用程序不受跨站点脚本攻击 开发环境是VS 2012,MVC4,淘汰赛 我已放置防伪令牌如下ajax反伪造令牌json,json,asp.net-mvc-4,antiforgerytoken,Json,Asp.net Mvc 4,Antiforgerytoken,我使用防伪令牌保护我的应用程序不受跨站点脚本攻击 开发环境是VS 2012,MVC4,淘汰赛 我已放置防伪令牌如下 <form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form> $.ajax({ url: VirtualDir + '/Tasks/StartTask/',
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>
$.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);
}
我的控制器代码如下
<form id="__AjaxAntiForgeryForm" action="#" method="post"><%= Html.AntiForgeryToken()%></form>
$.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);
}
在控制器中,接收到其TAB参数但oTaskData为null的值
若我移除防伪令牌,那个么控制器中的数据将被正确接收
如何将antiforgery令牌与JSON数据一起使用 在JSON中发送多个值时。您必须像这样进行字符串化: 我将JSON字符串从Ajax请求中分离出来,以澄清这一点
var sData = JSON.stringify({
__RequestVerificationToken : token,
oTaskData: item,
whichTab: self.CurrentTab
});
在Ajax请求中添加以下内容:contentType:'application/json'
,
显示您正在发送Json数据
您将返回Json,因此也返回数据类型:“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请求的标题
您必须创建此属性类:
ValidateJsonAntiForgeryTokenAttribute
,您可以在答案中看到:Duplicate:您的方法缺少[HttpPost]属性。我已经检查了该问题。不同之处在于,在该示例中,只传递了一个int类型的参数。在我的示例中,我发送的是object。即使在添加[HttpPost]之后,它也不起作用。它甚至不去控制器。您在控制器中的方法上获得了[HttpPost]属性了吗?