Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在JSON post请求中提供AntiForgeryToken_C#_Jquery_Asp.net_Json_Asp.net Mvc - Fatal编程技术网

C# 在JSON post请求中提供AntiForgeryToken

C# 在JSON post请求中提供AntiForgeryToken,c#,jquery,asp.net,json,asp.net-mvc,C#,Jquery,Asp.net,Json,Asp.net Mvc,我检查: 并尝试了所有提到的东西。可悲的是,任何提议都不起作用 var token = $('input[name="__RequestVerificationToken"]').val(); var headers = {}; headers['__RequestVerificationToken'] = token; var data = serializeData(token); $.ajax( { cache: false, async: false,

我检查:

并尝试了所有提到的东西。可悲的是,任何提议都不起作用

var token = $('input[name="__RequestVerificationToken"]').val();

var headers = {};

headers['__RequestVerificationToken'] = token;

var data = serializeData(token);

$.ajax(
{
    cache: false,
    async: false,
    type: 'POST'
    url: url
    data: data,
    dataType: 'json',
    contentType: 'application/json; charset=utf-8',
    headers: headers,
    success: function (result) {
    },
    error: function () {
        e.stopPropagation();
    }
});

function serializeData(token) {   
var data = {
    __RequestVerificationToken: token,
    MyJsonData : JSON.stringify(myFormData),
};

return data;   
}
我总是得到一个例外,即
RequestVerificationToken
不存在

但是,如果我从ajax调用中排除
contentType
参数,它将成功验证令牌,但控制器中的MyJsonData为null,并且会出现异常:

{“从类型'System.String'到类型的参数转换 “MyJsonData”失败 因为没有类型转换器可以在这些类型之间转换。“}

我还尝试将令牌作为请求头的一部分发送,但这也不起作用。

我建议。这个库将字符串化并发送您的数据,就像它是一个使用ajax的常规表单提交一样。我将它与验证令牌一起使用,没有任何问题

选项: 例如:

这将在致电后立即提交表格

$("#myFormId").ajaxSubmit(options)
这将一直等到单击表单提交按钮,然后改用ajax提交

$("#myFormId").ajaxForm(options) 
因此,我认为使用自定义属性将是更好的解决方案。因此,与其用数据序列化令牌,不如让这个属性来完成这项工作

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
    public sealed class ValidateJsonAntiForgeryTokenAttribute  : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            var httpContext = filterContext.HttpContext;
            var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
            AntiForgery.Validate(cookie != null ? cookie.Value : null, 
                                 httpContext.Request.Headers["__RequestVerificationToken"]);
        }
    }
并用

[HttpPost] 
[ValidateJsonAntiForgeryToken]
public ActionResult DoSomething(Foo foo) {
    //Do something
}

如果要以json的形式发送,需要自己对数据进行字符串化*永远不要使用
async:false
这是一种糟糕的做法,不推荐使用。查看浏览器控制台中抛出的警告,但与仅使用json.stringify有什么区别?我发布了“data”对象,当以这种方式序列化时,它看起来还可以。您正在串接错误的对象,以
application/json
的形式发送整个内容。如果这是您在服务器上所期望的,那么函数中的
返回JSON.stringify(data)
将是我的坏消息没有提供足够的详细信息,即使按照您建议的方式(令牌不存在),它仍然会失败。我想如果删除
contentType
有效,您希望在服务器上定期发布,并且您的问题在于服务器代码
[HttpPost] 
[ValidateJsonAntiForgeryToken]
public ActionResult DoSomething(Foo foo) {
    //Do something
}