ajax反伪造令牌json

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/',

我使用防伪令牌保护我的应用程序不受跨站点脚本攻击 开发环境是VS 2012,MVC4,淘汰赛

我已放置防伪令牌如下

<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]属性了吗?