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

时间:2018-08-21 19:13:28

标签: javascript ajax asp.net-mvc jquery-ui-tabs

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

$。ajax调用中的这两个设置(我根本没有注意到)正在为我破坏它:

contentType: false,
processData: false

当删除这两个设置并且在PartialView中生成AntiForgeryToken时,以动态生成的形式包含AntiForgeryTokens的Ajax帖子可以正常工作,如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调用进行延迟加载。

如果我从第一个选项卡发回(使用表单提交或Ajax发布),则在Controller方法上使用ValidateAntiForgeryToken,它可以正常工作。我可以回发整个表单,也可以将__RequestVerificationToken隐藏输入的值附加到要发布的数据中。两种方法都可以在第一个选项卡上正常工作。

当我从其他任何标签中发帖时,都会出现问题。

如果用户选择任何其他选项卡,则将导致触发javascript方法,进而对Controller方法进行ajax GET调用,该方法又返回PartialView。此PartialView包含一个表单。在ajax GET调用成功的情况下,我通过调用jquery html()显示Controller方法返回的html。然后,我通过$ .validator.unobtrusive.parse传递动态生成的表单,以便可以使用非侵入式验证。所有这些都很好。

唯一的问题是,当我从这种动态生成的表单发回服务器时,我想用ValidateAntiForgeryToken属性装饰Controller方法。 las,当我这样做时,我会收到HttpAntiForgeryException。

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

我也尝试过从第一个选项卡中获取__RequestVerificationToken,以为这就是Controller所“期望的”。 las,这还会导致HttpAntiForgeryException。

当我从这些延迟加载的,ajax生成的表单之一中发回邮件时,是否可以使用AntiForgeryToken / ValidateAntiForgeryToken?

1 个答案:

答案 0 :(得分:2)

这是绝对可行的,并且可以通过动态序列化表单数据以在每次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调用中。如果在方法中放置一个断点,则应该看到实际上可以触及。