javascript - 没有表单的 ASP.NET Core Antiforgery Token
问题描述
是否可以有没有表格的防伪令牌?我有一个需要防伪令牌的ajax post call。然而,我见过的大多数例子都是要求表格。这是我到目前为止所拥有的:
<script>
$(document).ready(function () {
var SessionId = document.getElementById("Id").value;
var form_data = {
"SessionId": SessionId
};
$.ajax({
url: "@Url.Action("GetHistory", @ViewContext.RouteData.Values["controller"].ToString())",
method: "POST",
data: JSON.stringify(form_data),
contentType: "application/json",
success: function (result) {
console.log(result);
var output = JSON.parse(result);
for (var i = 0; i < output.length; i++) {
var p = document.createElement("span");
var q = document.createElement("li");
if (output[i].Mine == true) {
p.setAttribute("class", "Sender Me");
q.setAttribute("class", "Message");
} else {
p.setAttribute("class", "Sender");
q.setAttribute("class", "Message");
}
p.textContent = output[i].Name + " - " + moment(output[i].CreatedOn).format("DD-MM-YYYY HH:mm:ss");
q.textContent = output[i].Message;
document.getElementById("MessageList").appendChild(p);
document.getElementById("MessageList").appendChild(q);
}
},
error: function (error) {
console.log(error);
}
});
$('#MessageList').stop().animate({
scrollTop: $('#MessageList')[0].scrollHeight
}, 2000);
return false;
});
</script>
这只是从文本框和未附加到表单的按钮中获取输入。
解决方案
Ajax 请求可以将请求头中的防伪令牌发送到服务器。请参阅在 ASP.NET Core Razor Pages 中处理 Ajax 请求中的解决方案。
<script type="text/javascript">
function gettoken() {
var token = '@Html.AntiForgeryToken()';
token = $(token).val();
return token;
}
</script>
<script>
$(document).ready(function () {
var SessionId = document.getElementById("Id").value;
var form_data = {
"SessionId": SessionId
};
var headers = {};
headers['XSRF-TOKEN'] = gettoken();//header name could be changed
$.ajax({
url: "/Home/testPost",
method: "POST",
data: JSON.stringify(form_data),
headers:headers,
contentType: "application/json",
success: function (result) {
console.log(result);
//...
},
error: function (error) {
console.log(error);
}
});
//...
});
然后您需要配置防伪服务以查找XSRF-TOKEN
您定义的标头:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}
当然,您需要[ValidateAntiForgeryToken]
为您的操作使用正确的模型绑定和属性。
推荐阅读
- django - 如何处理来自通过自定义模板标签加载的 Django 表单的 POST 请求?
- linux - fetchmail 警告 imap.gmail.com 服务器证书
- c# - 哪个属性或方法在 ASP.Net Core MVC 2.2 中返回活动/关闭/进行中状态的连接数
- ios - 导入的分发证书未显示在钥匙串访问中
- ssh - 在远程会话中使用 tmux 选择鼠标后复制到客户端剪贴板
- c++ - 如果方法用作 constexpr,则切换实现?
- flutter - 如何在颤振中不生成红框,android studio,
- java - 我得到一个空指针异常,我不知道为什么,你能帮帮我吗?爪哇
- julia - 如何解决两个输入都稀疏的线性系统?
- syntax-error - 使用 Lisp 查找列表的位置