如何设置jQuery Ajax调用以在Asp.Net MVC中的thair请求头中全局注入AntiForgeryToken

我在Asp.net MVC 5项目上工作,并且知道有两种方法可以在ajax调用AntiForgeryToken传递给服务器:

  • 把它放在Header
  • 把它放在Data

我喜欢在request header放入AntiForgeryToken ,我的代码在客户端和服务器端都很好用。 我跟着这篇文章 。

我把AntiForgeryToken放在每个$.ajax调用header ,它运行良好

现在我决定编写新代码,将AntiForgeryToken添加到全局页面中具有POST类型的所有Ajax调用,并删除每个$.ajax代码块中的标头设置。

然后我写了这些代码来实现我的决定,当我在我的页面中有一个表单时, 它也很有效 (我没有在诸如页面中的多个表单等集合的情况下测试它…):

 var antiForgerytoken = $('input[name="__RequestVerificationToken"]').val(); $.ajaxPrefilter(function (options, originalOptions, jqXhr) { if (options.type.toUpperCase() == "POST") { jqXhr.setRequestHeader("__RequestVerificationToken", antiForgerytoken); } }); 

我的问题:

  1. 这个决定有任何安全性或不恰当的副作用吗?
  2. 当我在我的页面中有多个表单 ,每个表单不同的局部视图创建并将通过不同控制器中的不同操作处理时,我应该在每个表单中找到相关的AntiForgeryToken并将其注入到与该表单相关的所有Ajax调用中吗? 或者只是上面的代码就足够了?

也许这个问题的基础是写在这里的另一个问题, @ DarinDimitrov回答它包括这个描述:

ASP.NET MVC将简单地为所有表单重用相同的值,因此它不需要知道发送请求的表单以validation它

这个规则是绝对的吗? 你知道参考吗? 我在@DarinDimitrov回答的评论中看到了一些相反的观点

  1. 如果我应该分别对每个表单AntiForgeryToken行为,我应该如何更改上面的代码以全局设置Ajax头中的AntiForgeryToken以使用在MVC页面中呈现的所有表单?