c# - ValidateAntiforgeryToken 不适用于 ASP.NET MVC 中的 Ajax
问题描述
有这个观点:
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
<div id='calendar'></div>
<script src="~/Scripts/Services/Agenda.js" type="text/javascript"></script>
}
执行以下两行JS代码:
let form = $('#__AjaxAntiForgeryForm');
let token = $('input[name="__RequestVerificationToken"]', form).val();
然后调用这个函数:
function dbUpdate(data, startTime, title) {
let evento = JSON.stringify({
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
});
$.ajax({
type: "POST",
url: 'Agenda/DbUpdate',
data: evento,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (response) {
console.log("Response");
},
complete: function () {
console.log("After");
},
failure: function (jqXHR, textStatus, errorThrown) {
alert("HTTP Status: " + jqXHR.status + "; Error Text: " + jqXHR.responseText); // Display error message
}
});
}
- 生成的 Json 示例:
{
"Data":"2020-0105T03:00:00.000Z",
"StartTime":"8",
"Title":"Sdf",
"__RequestVerificationToken":"IMBfPM4YPyslt_89W6Kfu_Nmy6OW2-8I4n3fp42Figy__2gid3wY8gMC-
glB2o3Y6v6TCEG18nZXRPfLltU2RpOvoy-rMFIyo-uPA2XL4JcFF1aJfXix6RWkTI5l6Ewqhyu5jSQnszEOre2ZP-az3Q2"
}
控制器是:
[HttpPost]
[AjaxAuthorize]
[ValidateAntiForgeryToken]
public async Task<JsonResult> DbUpdate(AgendaEvent compromisso)
{
...
return Json("ok");
}
和 AgendaEvent 类:
public DateTime Data { get; set; }
public string StartTime { get; set; }
public string Title { get; set; }
public string __RequestVerificationToken { get; set; }
请注意,如果我在没有 __RequestVerificationToken 的情况下创建课程,则为:
public DateTime Data { get; set; }
public string StartTime { get; set; }
public string Title { get; set; }
我收到错误 404。
但是令牌,即使存在于传递的数据中,也不会被验证。
怎么了?
解决方案
正如 lordvlad30 所建议的,错误是由于以下行:
let evento = JSON.stringify({
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
});
具体来说,它不应该有 JSON.stringify() 语句。因此,正确的是:
let evento = {
'Data': data,
'StartTime': startTime,
'Title': title,
'__RequestVerificationToken': token
};
一切正常!
推荐阅读
- php - Google Search Console - 新添加的网站显示在 Google 网站管理员中,但未显示在 Search Console 中
- python - 查找两个时钟指针之间度数的问题(Python)
- javascript - 如何使用 JS 为多个元素创建一个数字计数器?
- java - 将整数数组转换为集合然后查找交点
- html - 即使清除缓存后网站图标也不显示
- python - 索引列表中包含的每个元组的最 Pythonic 方式
- python - 如何在python中删除具有nan值的行
- node.js - Node/Express (Mongo) 传递完成(“完成不是函数”错误)
- python - 如何在 Python 中使用多处理终止进程?
- javascript - 访问 JSON 对象的键值