Я получаю следующую ошибку при публикации в MVC 5 Просмотр с использованием JQuery Ajax:
Обязательное поле формы защиты от подделки "_RequestVerificationToken" отсутствует
* 1004 Microsoft предлагает следующее решение этой проблемы в следующей статье:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks
Но код, который они предлагают в конце статьи, не работает для меня.
Вот мой контроллер:
[HttpPost]
[Authorize]
[ValidateAntiForgeryToken]
public JsonResult PurchaseOrderVendor(int vendorId)
{
VendorViewModel aVendorViewModel = VendorServices.GetVendorViewModelForId(vendorId);
return Json(aVendorViewModel);
}
Вот JavaScript, выполняющий операцию JQuery Ajax, которая генерирует ошибку:
Вот где ошибка:
function getVendorDetailForVendorId(vendorId) {
$.ajax(
{
type: "POST",
data: { vendorId: vendorId },
url: '/PurchaseOrder/PurchaseOrderVendor',
datatype: "json",
headers: {
'RequestVerificationToken': '@TokenHeaderValue()'
}
})
.done(function (aVendorViewModel) {
DisplayVendorDetail(aVendorViewModel);
})
.fail(function (xhr) {
alert('Problem at getVendorDetailForVendorId: ' + xhr.responseText);
});
Функция TokenHeaderValue в параметре headers определена в моем представлении в BeginForm, как описано в статье, показанной ниже:
@using (Html.BeginForm(new { id = "idPurchaseOrderForm" }))
{
@Html.AntiForgeryToken()
@functions{
public string TokenHeaderValue()
{
string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;
}
}
Код, указанный выше, вызывает ошибку. Все это началось, как только я добавил украшение [ValidateAntiForgeryToken] в метод контроллера и изменил свой JavaScript, чтобы он соответствовал тому, что было в статье, для использования TokenHeaderValue @functions. До этого все работало нормально, без добавления [ValidateAntiForgeryToken] к контроллеру. Ниже мой оригинальный код JavaScript, прежде чем я изменил его, чтобы он выглядел как статья. Приведенный ниже код работал нормально, но он не решал проблему с подделкой, которую я пытаюсь решить:
Это работает без реализации AntiForgeryToken:
function getVendorDetailForVendorId(vendorId) {
$.ajax(
{
type: "POST",
data: { vendorId: vendorId },
//url: '@Url.Action("PurchaseOrderVendor", "PurchaseOrder")',
url: '/PurchaseOrder/PurchaseOrderVendor',
datatype: "json"
})
.done(function (aVendorViewModel) {
//alert("getVendorDetailForVendorId: " + aVendorViewModel)
DisplayVendorDetail(aVendorViewModel);
})
.fail(function (xhr) {
alert('error', xhr);
});
}
Я хотел бы, чтобы метод контроллера использовал [ValidateAntiForgeryToken], но я не знаю, что не так с JavaScript, который я изменил, чтобы выглядеть как статья. Любая помощь будет принята с благодарностью. Заранее спасибо.