【发布时间】:2017-11-21 22:39:24
【问题描述】:
嗯,我有一个通过表单 tagHelper 呈现的表单。所以它包含了防伪令牌的特殊隐藏。
我正在尝试发送以下 ajax 请求:
var data = JSON.stringify(feedbackForm.serializeArray().reduce((res, item) => {
res[item.name] = item.value;
return res; }, {}));
// data example: '{"Description":"some description", "__RequestVerificationToken":"CfDJ8F9f8kTKlVNEsnTxejQIJ__pRCl2CuZTQDVAY2216J7GgHWGDC0XUMPc0FKHpr_K5uhz8Kx0VeHDkIPdQ3V0Xur9oLE2u_bpfXuVss6AWX3BVh0WbwfQriaibOrf_yvEuIYZV-jHU_G-AHPD91cKz_QE7MVmeLVgTum80yTb8biGctMtJcU67Wp7ZgN86yMuew"}'`
$.ajax({
type: "POST",
url: '@Url.Action("Feedback", "Profile", new {Area = ""})',
contentType: "application/json; charset=utf-8",
data: data,
dataType: "json"
});
到看起来像这样的控制器操作:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Feedback([FromBody]FeedbackViewModel vm)
{
...
}
所以发布的数据包含防伪令牌的密钥,但是请求仍然没有通过防伪验证并失败并出现错误。如果我从控制器中删除防伪验证属性,它就会完美地工作。
为什么它不检查请求正文中的令牌 - 这是设计使然,还是某种问题?
【问题讨论】:
-
好吧,我不想将实现更改为标头,我想找出为什么它不适用于请求正文。
-
我最近一直在做类似的工作,IIRC,你需要标题和数据元素匹配。
-
@silent_coder 我相信你在找this
-
我没有时间完全验证它,但是我认为当您将数据作为 json(“application/json”)发送到 CSRF 中间件时,它无法验证令牌无法反序列化 json 并从那里获取令牌。但是,如果您的 ajax 帖子将数据作为 url 编码形式(“application/x-www-form-urlencoded”)发送,这与常规帖子基本相同。这就是为什么在 json 情况下您需要将令牌添加为标头
标签: c# jquery ajax asp.net-core asp.net-core-mvc