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
}