Задать вопрос
@laravel_creative_3103

Как правильно использовать [ValidateAntiForgeryToken] .NET с использование SPA React?

Имеется метод:
//[Authorize] 
        [ValidateAntiForgeryToken]
        [ApiExplorerSettings(IgnoreApi = false)]
        [AllowAnonymous]
        [HttpPost("login")]
        public async Task<IActionResult> Login([FromBody] LoginViewModel model)
        { 
            //
        }


На уровне Startup прописан такой сервис:
services.AddAntiforgery(o => 
            {
                //o.Cookie.Name = "X-Xsrf-Token";
                o.HeaderName = "X-XSRF-TOKEN";
            });


На уровне Startup прописан такой middleware:
app.Use(next => context => 
            {

                string path = context.Request.Path.Value;

                string[] urlAreas = { "/api", "/swagger", "articles" };

                if (

                    string.Equals(path, "/", StringComparison.OrdinalIgnoreCase) ||

                    string.Equals(path, "/index.html", StringComparison.OrdinalIgnoreCase) ||

                    urlAreas.Any(url=>path.StartsWith(url))

                    )

                {

                    var tokens = antiforgery.GetAndStoreTokens(context);

                    context.Response.Cookies.Append("XSRF-TOKEN", tokens.RequestToken,

                        new CookieOptions() {

                            HttpOnly = false ,

                            Secure=false,

                            IsEssential=true,

                            SameSite=SameSiteMode.Strict                       

                        });
                }
                return next(context);
            });


В самом приложении React прописан такой метод:
let csrftoken = this.getCookie("XSRF-TOKEN");
axios
      .post(url, data, {
        headers: {
          'X-XSRF-TOKEN': csrftoken
        }
      })
getCookie(name) {
    let cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        const cookies = document.cookie.split(';');
        for (let i = 0; i < cookies.length; i++) {
            const cookie = cookies[i].trim();
            Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
  return cookieValue;
}


При отправке запроса не пропускает на сервер, пишет 400 (Bad Request). В чем может быть ошибка?
  • Вопрос задан
  • 362 просмотра
Подписаться 3 Средний 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
yarosroman
@yarosroman
C# the best
Эм, а зачем для апи запросов использовать AntiForgeryToken?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы