Невозможно проверить токен защиты от подделки

Я пытался передать токен защиты от подделки моему методу HTTPPost в контроллере MVC из моего файла js. Я получаю следующую ошибку:

Ошибка проверки токена защиты от подделки: отсутствует требуемый файл cookie защиты от подделки __RequestVerificationToken.

Когда я пытаюсь отладить код js и вижу, я вижу токен в переменной antiForgeryToken. Но не уверен, что происходит. Может кто-нибудь сказать мне, что я делаю не так? Вот мой код из файла js:

options.data = function (find) {
                                var antiForgeryToken = $("#forgeryToken").val();
                                fetch('/Options/Students/StudentScore',
                                    {
                                        method: 'POST',
                                        body: JSON.stringify({
                                            find: find,
                                            querystringParams: querystringParams
                                        }),
                                        headers: {
                                            "Content-type": "application/json; charset=UTF-8",
                                            "RequestVerificationToken": antiForgeryToken
                                        } 
                                    })
                                    .then(function (response) { return response.json() })
                                    .then(function (response) {
                                        var mapped = _.map(response.Results,
                                            function(i) {
                                                return {
                                                    DisplayValue: i.text
                                                }
                                            });
                                        return mapped;
                                    })
                                    .catch(function(err) {
                                        debugger;  
                                    });
                            }

Вот мой метод действий

        [System.Web.Mvc.HttpPost]
        [ValidateAntiForgeryTokenAttribute]
        public async Task<ActionResult> StudentScore([FromBody] StudentValues request)
        {
            //Implementation
            return JsonNet(sometestval, JsonRequestBehavior.AllowGet);
        }

Вот мой класс антифальсификации

[AttributeUsage(AttributeTargets.Method)]
    public class ValidateAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
    {
        public void OnAuthorization(AuthorizationContext filterContext)
        {
            try
            {
                if (filterContext.HttpContext.Request.IsAjaxRequest())
                {
                    ValidateRequestHeader(filterContext.HttpContext.Request);
                }
                else
                {
                    AntiForgery.Validate();
                }
                    
            }
            catch(Exception e)
            {
                throws exception;
            }
        }

        private static void ValidateRequestHeader(HttpRequestBase request)
        {
            var cookieToken = string.Empty;
            var formToken = string.Empty;
            var tokenValue = request.Headers["RequestVerificationToken"];
            if (!string.IsNullOrEmpty(tokenValue))
            {
                var tokens = tokenValue.Split(':');
                if (tokens.Length == 2)
                {
                    cookieToken = tokens[0].Trim();
                    formToken = tokens[1].Trim();
                }
            }

            AntiForgery.Validate(cookieToken, formToken);
        }
    }

person user2083386    schedule 11.03.2021    source источник
comment
Как сказал Willy David Jr, вам нужно получить данные из $ ('input [name = __ RequestVerificationToken]'). Если у вас нет ввода с именем __RequestVerificationToken, вам нужно добавить @Html.AntiForgeryToken() или <form method="post"></form> в ваше представление.   -  person Yiyi You    schedule 15.03.2021


Ответы (1)


Попробуйте отредактировать вот это:

var antiForgeryToken = $("#forgeryToken").val();

К этому:

var antiForgeryToken = $('input[name="__RequestVerificationToken"]').val();

Обычно токен AntiForgery называется __RequestVerificationToken, а не идентификатором с forgeryToken, если вы явно не переименовали его.

person Willy David Jr    schedule 12.03.2021