是否有没有表格的防伪令牌?我有一个ajax帖子,我想让它需要一个防伪令牌。但是,我看到的大多数示例都要求提供表格。这是我到目前为止的内容:
<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>
这只是从文本框和未附加到表单的按钮获取输入。
答案 0 :(得分:0)
AntiforgeryToken可以防止跨站点请求伪造。因此,您应该真正使用它。在jQuery中获取代码最简单的方法是在页面上呈现一个虚拟的隐藏表单。然后,您可以使用JavaScript从虚拟表单中复制令牌,并将其包含在ajax帖子中。
答案 1 :(得分:0)
您需要手动添加。试试这个:
var token = $("[name='__RequestVerificationToken']").val();
然后将其与您的数据一起发布:
data: {
__RequestVerificationToken: token,
JSON.stringify(form_data)
}
编辑:
如@AndresAbel所述,您可以从表单中复制令牌,并将其发送到ajax帖子中:
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" }))
{
@Html.AntiForgeryToken()
}
然后在您的脚本中输入:
var token = $('input[name="__RequestVerificationToken"]', $('#__AjaxAntiForgeryForm')).val();
然后将其发送到ajax:
data: {
__RequestVerificationToken: token,
JSON.stringify(form_data)
}
不要忘记在控制器中为您的方法添加注释[ValidateAntiForgeryToken]
。
答案 2 :(得分:0)
Ajax请求可以将请求标头中的防伪令牌发送到服务器。请参考Handle Ajax Requests in ASP.NET Core Razor Pages中的解决方案。
<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]
属性。