jQuery Ajax调用和Html.AntiForgeryToken()

我已经在我的应用程序中实现了对CSRF攻击的缓解,这些信息是我在互联网上的一些博客文章中读到的。特别是,这些帖子一直是我实施的驱动力

  • ASP.NET和Web工具开发人员内容团队提供的ASP.NET MVC最佳实践
  • Phil Haack博客中的跨站点请求伪造攻击剖析
  • ASP.NET MVC框架中的AntiForgeryToken-David Hayden博客中的Html.AntiForgeryToken和ValidateAntiForgeryToken属性

基本上,这些文章和建议指出,为了防止CSRF攻击,任何人都应该实现以下代码:

  1. 在接受POST Http谓词的每个操作上添加[ValidateAntiForgeryToken]

    [HttpPost]
    [ValidateAntiForgeryToken]
    公共行动结果SomeAction(SomeModel模型){
    }

  2. 添加<%=Html.AntiForgeryToken()%&gt帮助程序

无论如何,在我的应用程序的某些部分中,我使用jQuery向服务器发送Ajax帖子,而没有任何表单。例如,当我让用户单击图像以执行特定操作时,就会发生这种情况

假设我有一张有活动列表的桌子。我在表格的一列上有一个图像,上面写着;“将活动标记为已完成”;当用户单击该活动时,我正在执行以下示例中的Ajax帖子:

$(“a.markAsDone”)。单击(函数(事件){
event.preventDefault();
$.ajax({
类型:“post”;,
数据类型:“html”;,
url:$(this.attr(“rel”),
数据:{},
成功:功能(响应){
// ....
}
});
});

如何使用<%=Html.AntiForgeryToken()%&gt在这些情况下?我应该在Ajax调用的数据参数中包含helper调用吗

很抱歉发了这么长的帖子,非常感谢你的帮助

编辑

根据jayrdub的回答,我采用了以下方式

$(“a.markAsDone”)。单击(函数(事件){
event.preventDefault();
$.ajax({
类型:“post”;,
数据类型:“html”;,
url:$(this.attr(“rel”),
数据:{
AddAntiForgeryToken({}),
id:parseInt($(this.attr)(“title”)
},
成功:功能(响应){
// ....
}
});
});

我使用这样一个简单的js函数

AddAntiForgeryToken=函数(数据){
数据.uuu RequestVerificationToken=$('#uuu AjaxAntiForgeryForm输入[name=uuu RequestVerificationToken]')。val();
返回数据;
};

由于页面上的每个表单都具有相同的令牌值,所以只需在最上面的母版页中放置类似的内容

<%——用于AddAntiForgeryToken()中的ajax--%>
<表单id=“\uu AjaxAntiForgeryForm”操作=“#”方法=“post”&gt<%=Html.AntiForgeryToken()%&gt&lt/表格>

然后在ajax调用中执行(编辑以匹配第二个示例)

$.ajax({
类型:“post”,
数据类型:“html”,
url:$(this.attr(“rel”),
数据:AddAntiForgeryToken({id:parseInt($(this.attr(“title”))}),
成功:功能(响应){
// ....
}
});

发表评论