Можно ли иметь токены антифальсификации без форм? У меня есть почтовый вызов 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.info(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.info(error);
}
});
$('#MessageList').stop().animate({
scrollTop: $('#MessageList')[0].scrollHeight
}, 2000);
return false;
});
</script>
Это просто получает ввод из текстового поля и кнопки, которая не прикреплена к форме.
Итак, если я сделаю вызов ajax без формы, будет ли мой вызов POST безопасным?
Не будь моим! но вы можете отправить форму с помощью ajax с токеном защиты от подделки.
Это хорошо описано в официальные документы. Вы использовали описанный там подход?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


AntiforgeryToken предназначен для предотвращения подделки межсайтовых запросов. Так что вы должны действительно использовать его. Самый простой способ получить его в jQuery — отобразить на странице фиктивную скрытую форму. Затем вы можете использовать свой javaScript, чтобы скопировать токен из фиктивной формы и включить его в свой пост ajax.
Вам нужно добавить его вручную. Попробуй это:
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] для вашего метода в контроллере.
Привет! Ваш метод почти работает для меня. Я получаю сообщение об ошибке. Неожиданный токен из раздела data:{}. Что-то не так?
Запрос Ajax может отправить маркер защиты от подделки в заголовке запроса на сервер. См. решение в Обработка запросов Ajax в 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.info(result);
//...
},
error: function (error) {
console.info(error);
}
});
//...
});
Затем вам нужно настроить службу защиты от подделки для поиска определенного вами заголовка XSRF-TOKEN:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}
Конечно, вам нужно использовать правильную привязку модели и атрибут [ValidateAntiForgeryToken] для своего действия.
Как это будет возможно? Токен Anti Forgery генерируется при отображении формы.