Javascript 使用AJAX调用获取表单时是否使用AntiForgeryToken?

Javascript 使用AJAX调用获取表单时是否使用AntiForgeryToken?,javascript,ajax,asp.net-mvc,jquery-ui-tabs,Javascript,Ajax,Asp.net Mvc,Jquery Ui Tabs,---------------更新,向下滚动查看原始问题---------------------- $.ajax调用中的这两个设置(我根本没有注意到)打破了我的习惯: contentType: false, processData: false 当删除这两个设置并在PartialView中生成AntiForgeryToken(如Stephen Muecke的评论中所述)时,动态生成表单中带有AntiForgeryToken的Ajax帖子工作正常。成功的$.ajax调用如下所示,其中u Req

---------------更新,向下滚动查看原始问题----------------------

$.ajax调用中的这两个设置(我根本没有注意到)打破了我的习惯:

contentType: false,
processData: false
当删除这两个设置并在PartialView中生成AntiForgeryToken(如Stephen Muecke的评论中所述)时,动态生成表单中带有AntiForgeryToken的Ajax帖子工作正常。成功的$.ajax调用如下所示,其中u RequestVerificationToken来自部分视图中对@HtmlAntiForgeryToken()的调用:

$.ajax({
    url: '/MyUrl',
    type: "POST",
    data: {__RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val()
          },
    success: function (responseText) {
    ...and etc
----------下面是原始问题------------------------------------------

是否可以在通过ajax调用动态加载的表单上使用AntiForgeryToken

在我的asp.NETMVC应用程序中,我使用Jquery选项卡。当页面加载时,我只加载第一个选项卡。此第一个选项卡始终包含表单,此表单始终包含AntiForgeryToken。其他选项卡是延迟加载的,当用户选择它们时,通过ajax调用进行加载

如果我从第一个选项卡发回帖子(使用表单提交或ajax帖子),我会在控制器方法上使用ValidateAntiForgeryToken,它可以正常工作。我可以发回整个表单,或者将u RequestVerificationToken隐藏输入的值附加到正在发布的数据中。这两种方法都可以在第一个选项卡上正常工作

当我从任何其他选项卡发布时,问题就出现了

如果用户选择任何其他选项卡,则会触发一个javascript方法,该方法依次对控制器方法进行ajax GET调用,然后返回PartialView。此PartialView包含一个表单。在ajaxget调用的成功事件中,我通过调用jquery html()显示控制器方法返回的html。然后,我通过$.validator.unobtrusive.parse传递动态生成的表单,以便使用unobtrusive验证。所有这些都很好

唯一的问题是,当我从这个动态生成的表单发回服务器时,我想用ValidateAntiForgeryToken属性装饰控制器方法。唉,当我这样做时,我得到了一个HttpAntiforyException

我已经尝试在动态生成的表单(即PartialView)中包含@Html.AntiForgeryToken()调用。这将生成预期的uu RequestVerificationToken隐藏输入,但当我将此值传递回控制器时,将导致HttpAntiForgeryException

我还尝试从第一个选项卡获取_RequestVerificationToken,认为这可能是控制器“期望的”。唉,这也会导致HttpAntiforyException


当我从这些延迟加载、ajax生成的表单之一发回时,是否有任何方法可以使用AntiForgeryToken/ValidateAntiForgeryToken?

完全可能,通过动态序列化表单数据来传递每个ajax调用

var data = $('#yourForm').serialize();
$.ajax({
    type: 'POST',
    url: "@Url.Action("yourMethod", "yourController")",
    data: data,
    cache: false,
    success: function (response) {
        // Your code here
    }
});

使用Chrome中的
Network
选项卡,您将看到令牌已附加到Ajax调用。如果您在方法中放置断点,您应该可以看到您实际上能够进入。

这是安全剧场,任何想要窃取内容的人都可以刮取令牌并提交请求,如果部分视图中包含
@Html.AntiForgeryToken()
,该请求将正常工作。抛出的实际错误是什么(对于
httpantiforyexception
,有两个主要错误)@Tommy我管理每天都这样做的报废程序。我刮去代币并使用它,然后扔掉它并重复。@Tommy是的。我使用curl中介脚本处理从我的站点到目标站点的所有操作这不是Microsoft的问题,这是所有站点都面临的一般问题。充其量是它的安全战区,更糟糕的是毫无意义。任何称职的人都可以轻而易举地克服这一点。谢谢@Alfred,这在问题中描述的“第一”选项卡中效果很好,但在“其他”惰性加载选项卡中不起作用。我希望这种方法在延迟加载的选项卡中也能像在“第一”选项卡中一样工作,但事实并非如此,我也不知道为什么。在操作开始时放置一个断点,以便可以在Chrome中冻结执行和调试。当您显示网络时,您在“表单数据”中看到了什么?您看到了
\uu RequestVerificationToken
以及其他数据字段了吗?我在ajax调用中加入了“contentType:false,processData:false”来打破它。我突然得出结论,这个问题是由表格的呈现方式引起的。