【问题标题】:ajax antiforgery token jsonajax 防伪令牌 json
【发布时间】:2015-05-11 18:50:05
【问题描述】:

我正在使用防伪令牌保护我的应用程序免受跨站点脚本攻击 开发环境为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 为空 如果我删除了防伪令牌,那么控制器会正确接收数据

如何将防伪令牌与 JSON 数据一起使用?

【问题讨论】:

  • 您的方法缺少 [HttpPost] 属性。
  • 我已经检查了那个问题。不同之处在于,在该示例中,仅传递了一个 int 类型的参数。就我而言,我正在发送对象。
  • 添加了[HttpPost]后还是不行

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


【解决方案1】:

在 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);
                }
            });

编辑:

如果上述方法不起作用,请在此处使用答案: 使用 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

【讨论】:

  • 它甚至不去控制器
  • 控制器中的方法是否有 [HttpPost] 属性?
猜你喜欢
  • 2023-04-09
  • 2016-10-25
  • 1970-01-01
  • 2015-01-11
  • 1970-01-01
  • 2019-03-05
  • 2018-01-16
  • 2013-11-27
相关资源
最近更新 更多