У меня есть следующая форма:
<form asp-action="GetUsersAPICall" asp-controller="UsersObject" asp-antiforgery="true" data-ajax="true" data-ajax-method="get" data-ajax-mode="replace" data-ajax-update="#userSearchResult">
Enter email or name to search for: <input type="text" id="query" name="query"/>
<input type="submit" value="Search" />
</form>
<div id="userSearchResult"></div>
(Да, я понимаю, что я немного смешиваю ненавязчивый синтаксис AJAX с ASP. NET Помощниками основного тега).
У меня в контроллере есть следующий метод действия:
[HttpPost]
[Authorize(Roles = "PatchUser")]
//[ValidateAntiForgeryToken]
public async Task<IActionResult> PatchUserAPICall(UserPatchViewModel vm)
{
if (vm == null)
{
return BadRequest();
}
else if (!ModelState.IsValid)
{
return View(vm);
}
else
{
bool result = await vm.User.Update();
if (result)
{
return RedirectToAction("Confirmation");
}
else
{
return StatusCode((int)HttpStatusCode.InternalServerError);
}
}
}
Это прекрасно работает, если я не раскомментирую атрибут ValidateAntiForgeryToken
.
Я видел примеры выполнение проверки для jQuery AJAX вызовов, но многие из них полагаются на отправку их в заголовках (например, в в этом Q & A ). Предположительно, это заставит ValidateAntiForgeryToken
просто работать как положено (с некоторыми изменениями конфигурации в коде). Надеюсь, я не пропустил что-то очевидное, но я довольно долго искал и не могу найти, как на самом деле добавить заголовок в Unobtrusive AJAX, поэтому я даже не могу попробовать что-то подобное, чтобы увидеть, если это будет работать.
Я знаю, что вы можете сделать User.IsInRole("RoleName")
в качестве альтернативы атрибуту Authorize
. Есть ли способ отправить токен Anti-Forgery в качестве параметра и сделать это таким образом? Или есть способ отредактировать заголовки и сделать это таким образом? Или есть лучший способ сделать это, о котором я еще не думал?
В общем, есть ли способ отредактировать вызов Ajax до его отправки?