Как исправить MVC 5 JQuery Ajax ошибка обязательна, поле формы защиты от подделки отсутствует ошибка - PullRequest
0 голосов
/ 24 апреля 2020

Я получаю следующую ошибку при публикации в 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, который я изменил, чтобы выглядеть как статья. Любая помощь будет принята с благодарностью. Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...