AJAX将ValidateAntiForgeryToken(不带表单)发布到MVC操作方法

2021/01/30 07:51 · jquery ·  · 0评论

我一直在研究如何在SO上执行此操作的示例,据我所知,我已经尝试了所有可以成功找到的示例。我曾尝试根据自己的情况更改一些实现,但是到目前为止,这也失败了。

我在_layout.cshtml中的页面上有此标签,因此我总是有一个可用的令牌:

<form id="__AjaxAntiForgeryForm" action="#" method="post"> @Html.AntiForgeryToken()</form>

我的JavaScript utils文件中也有此方法:

AddAntiForgeryToken = function (data) {
    data.__RequestVerificationToken = $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val();
    return data;
};

这一切都按预期工作,我得到了一个防伪令牌。我的实际发布代码是:

myPage.saveData = function() {
    var saveUrl = '/exercises/PostData';

    var myData = JSON.stringify(myPage.contextsArrays);

    $.ajax({
        type: 'POST',
        async: false,
        url: saveUrl,
        data: AddAntiForgeryToken({ myResults: myData }),
        success: function () {
            alert('saved');
        },
        dataType: 'json',
        contentType: "application/json; charset=utf-8"
    });
};

我的动作方法如下所示:

    [HttpPost, ValidateAntiForgeryToken, JsonExceptionFilter]
    public JsonResult PostData(List<ResultsDc> myResults)
    {
        return Json(_apiClient.SubmitResults(myResults));
    }

我一直在尝试各种实现方式进行测试,并且响应始终是:

{"errorMessage":"The required anti-forgery form field \"__RequestVerificationToken\" is not present."}

我不是在发布表单,它只是一个数据数组,而是检查实际发布的数据,Json看起来不正确(已全部编码),但是存在__RequestVerificationToken参数名称,并且令牌值也存在。

目前,我对此感到非常困惑,无法找到发送令牌的正确方法,因此无法调用我的MVC操作。如果我删除该ValidateAntiForgeryToken属性并将JSON.stringify(myPage.contextsArrays);json作为数据,它看起来正确(未编码),并且映射良好。

我如何在没有表格的情况下正确发布此令牌?

纸板开发商再次罢工。

我要做的就是删除:

contentType: "application/json; charset=utf-8"

然后执行此操作(更改发出的发布请求的类型),以获取实际数据属性的Json内容以正确绑定到您的T模型类型,而不是 JSON.stringify()数据。

(注意:我知道这与这里已经没有太大不同)

我知道这个问题已经得到解决,但是我已经做了很多,并将把我的答案添加到更多内容中。我的网站上没有表格,因此我不得不想出办法来处理。大量关于stackoverflow的研究以及一些博客终于给了我所需的信息。

首先,这是我的“主”页面(MVC Razor)顶部的代码:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
    @Html.AntiForgeryToken()
}

然后,在所有ajax调用(jQuery)中,我都是这样开始的:

var token = $("#__AjaxAntiForgeryForm input").val();
var dataObject = {
  __RequestVerificationToken: token,
  myData: "whatever"
};

$.ajax({
  url: '@Url.Action("action", "controller")',
  type: 'POST',
  dataType: 'json',
  data: dataObject,
  error: function (jqXHR, textStatus, errorThrown) {
    console.log("ERROR!");
  },
  success: function (data) {
    //whatever
  }
});

最后,在控制器方面,这可以正常工作:

public class controllerController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public JsonResult action (myModel myData)
    {
        return Json(new { Success = "true" }, JsonRequestBehavior.DenyGet);
    }
}

希望这会帮助其他人。

验证被硬编码以查看表单数据。

https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.WebPages/Helpers/AntiXsrf/AntiForgeryTokenStore.cs

    public AntiForgeryToken GetFormToken(HttpContextBase httpContext)
    {
        string value = httpContext.Request.Form[_config.FormFieldName];

您可以按照某种格式模拟表单提交。为此,请参阅如何模仿POST请求中的HTML表单提交?

如果需要,还可以创建自己的验证器。如何使用ValidateAntiForgeryTokenJSON数据发布到Asp.Net MVC 2应用程序中,说明了如何执行此操作。它适用于MVC 2,但您可以从中汲取一些想法。

本文地址:http://jquery.askforanswer.com/ajaxjiangvalidateantiforgerytokenbudaibiaodanfabudaomvccaozuofangfa.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!