3 回答
TA贡献1811条经验 获得超4个赞
你不需要因为MVC 4. ValidationHttpRequestWrapper解决方案根据这个链接。
将令牌放在标题中。
创建一个过滤器。
将属性放在您的方法上。
这是我的解决方案:
var token = $('input[name="__RequestVerificationToken"]').val();
var headers = {};
headers['__RequestVerificationToken'] = token;
$.ajax({
type: 'POST',
url: '/MyTestMethod',
contentType: 'application/json; charset=utf-8',
headers: headers,
data: JSON.stringify({
Test: 'test'
}),
dataType: "json",
success: function () {},
error: function (xhr) {}
});
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public 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]
[AllowAnonymous]
[ValidateJsonAntiForgeryToken]
public async Task<JsonResult> MyTestMethod(string Test)
{
return Json(true);
}
TA贡献1911条经验 获得超7个赞
出问题的是,应该处理此请求并用[ValidateAntiForgeryToken]期望标记的控制器动作期望__RequestVerificationToken与该请求一起被称为POST 的参数。
您正在使用的参数中没有POST,JSON.stringify(data)它会将表单转换为JSON表示形式,因此会引发异常。
所以我可以在这里看到两个可能的解决方案:
数字1:用于x-www-form-urlencoded代替JSON发送您的请求参数:
data["__RequestVerificationToken"] = $('[name=__RequestVerificationToken]').val();
data["fiscalyear"] = fiscalyear;
// ... other data if necessary
$.ajax({
url: url,
type: 'POST',
context: document.body,
data: data,
success: function() { refresh(); }
});
数字2:将请求分为两个参数:
data["fiscalyear"] = fiscalyear;
// ... other data if necessary
var token = $('[name=__RequestVerificationToken]').val();
$.ajax({
url: url,
type: 'POST',
context: document.body,
data: { __RequestVerificationToken: token, jsonRequest: JSON.stringify(data) },
success: function() { refresh(); }
});
因此,在所有情况下,您都需要发布该__RequestVerificationToken值。
- 3 回答
- 0 关注
- 601 浏览
添加回答
举报