使用 AJAX 调用获取表单时使用 AntiForgeryToken?

Use AntiForgeryToken when form was fetched using AJAX call?

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

$.ajax 调用中的这两个设置(我根本没有注意到)对我来说是错误的:

contentType: false,
processData: false

Ajax posts with AntiForgeryTokens 在动态生成的表单中工作正常,当这两个设置被删除并且 AntiForgeryToken 在 PartialView 中生成时,如 Stephen Muecke 的评论所述。成功的 $.ajax 调用如下所示,其中 __RequestVerificationToken 来自局部视图中对 @HtmlAntiForgeryToken() 的调用:

$.ajax({
    url: '/MyUrl',
    type: "POST",
    data: {__RequestVerificationToken: $('input[name="__RequestVerificationToken"]').val()
          },
    success: function (responseText) {
    ...and etc

------------下面是原题-------------------------------- ----------

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

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

如果我 post 从第一个选项卡返回(使用表单提交或 ajax post),我在 Controller 方法上使用 ValidateAntiForgeryToken,它工作正常。我可以 post 返回整个表单,或者将 __RequestVerificationToken 隐藏输入的值附加到正在 post 编辑的数据中。这两种方法都适用于第一个选项卡。

当我从任何其他选项卡 post 时出现问题。

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

唯一的问题是,当我从这个动态生成的表单 post 返回到服务器时,我想用 ValidateAntiForgeryToken 属性修饰 Controller 方法。 las,当我这样做时,我得到一个 HttpAntiForgeryException。

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

我也试过从第一个选项卡中获取 __RequestVerificationToken,我想也许这就是控制器 "expecting." 唉,这也会导致 HttpAntiForgeryException。

当我 post 从这些延迟加载的 ajax 生成的表单之一返回时,有什么方法可以使用 AntiForgeryToken/ValidateAntiForgeryToken 吗?

绝对可能,通过动态序列化表单数据以在每次 Ajax 调用时传递 AntiForgeryToken 来完成。

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 调用。如果你在你的方法中放置一个断点,你应该看到你实际上能够到达。