В ASP.NET Core вы можете передавать токен защиты от подделки либо через форму, либо через заголовки.Поэтому я могу предложить вам 2 решения.
Решение 1. Заголовки
Чтобы платформа могла считывать токен из заголовков, вам нужно настроить AntiforgeryOptions
и установитьHeaderName
до null
значения.Добавьте этот код к Startup.cs
//or if you omit this configuration
//HeaderName will be "RequestVerificationToken" by default
services.AddAntiforgery(options =>
{
options.HeaderName = "X-CSRF-TOKEN"; //may be any other valid header name
});
и передайте токен защиты от подделки в AJAX
function Save() {
//..
//no need to set token value in group object
var Group = {
GroupId: "1",
GroupName: "My Group Name"
};
//..
}
function AjaxPost(url, data) {
return $.ajax({
type: "post",
contentType: "application/json;charset=utf-8",
dataType: "json",
responseType: "json",
headers: {
"X-CSRF-TOKEN": gettoken()
},
url: url,
data: JSON.stringify(data)
});
Решение 2. Форма
YouЯ уже пытался передать токен через форму, но это не сработало.Зачем?Причина состоит в том, что реализация по умолчанию IAntiforgeryTokenStore
(используется для чтения токенов из запроса) не может считывать токен защиты от подделки из json, а считывает его как данные формы.Если вы хотите, чтобы это работало, не запрашивайте данные stringify
и не удаляйте свойство contentType
из вызова $.ajax
.JQuery установит соответствующий тип контента и сериализует данные соответственно для вас.
//all other original code is unchanged, group needs to contain a token
function AjaxPost(url, data) {
return $.ajax({
type: "post",
dataType: "json",
responseType: "json",
url: url,
data: data
});
Также вам нужно удалить атрибут [FromBody]
из параметра действия, чтобы связыватель модели правильно связывал модель в этом случае
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddGroup(GroupView group)