JavaScript - Не принимается POST- запрос

Помогите, пожалуйста, в решении вопроса. Как на защищенный метод контроллера отправить Post-запрос с данными через js. Получаю 400ю ошибку. Когда убираю [ValidateAntiForgeryToken] получаю 415. В анонимном методе данные приходят при такой схеме аннотаций без
[AllowAnonymous] [HttpPost]


Код метода контроллера на C#

   [Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public IActionResult AddItemToStore([FromBody] StoreUser itemsStore)
    {
        StoreUser str = new StoreUser
        {

            Id = 1,
            UserId = itemsStore.UserId,
            CatrgoryId = itemsStore.CatrgoryId
        };

        return Ok(str);
    }

JS-код

var buttonAddOrder = document.getElementById("addToOrder");

buttonAddOrder?.addEventListener("click", function () {
    var catId = document.querySelector("#formToStore input[name = 'cardId']").value;
    var userId = document.querySelector("#formToStore input[name = 'userId']").value;
    var antiForgeryToken = document.querySelector("#formToStore input[name = '__RequestVerificationToken']").value;
    var itemsStore = {
        __RequestVerificationToken: antiForgeryToken,
        UserId: userId,
        CatrgoryId: catId,
        Payed: false
    };
    var url = "/CategoriesToUser/AddItemToStore"; 
    

    var response = fetch(url, {
        method: 'POST',
        mode: 'cors',
        cache: 'no-cache',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8;'
        },
        body: {
            __RequestVerificationToken: antiForgeryToken,
            itemsStore: itemsStore
        }
    })
        .then((response) => {
            return response.json();
        }).catch((e) => console.log(e.message));
    console.log('buttonAddOrder', response);
   
});

Код формы:

  <form id="formToStore"  method="post" enctype="multipart/form-data">
                <input type="hidden" name="cardId" id="cardId" />
                @{
                    var getUser = await UserManager.GetUserAsync(User);
                   
                }
                <input type="hidden" name="userId" asp-for="@getUser.Id" />

                <div class="modal-footer">
                    <button type="button" id="buttonclose" name="buttonclose" class="buttonclose btn btn-secondary" data-bs-dismiss="modal">Close</button>

                    <button type="button"
                            id="addToOrder" name="addToOrder"                           
                            class="btn btn-primary"                           
                         >
                        Add to Order
                    </button>
                </div>
            </form>

Такие варианты закинуть форму в FormData не помогают. также получаю 400ю

buttonAddOrder?.addEventListener("click", function () {
  
    var url = "/CategoriesToUser/AddItemToStore";
    const  formToStore = document.getElementById('formToStore');
    var formOrder = new FormData(formToStore);
   
    let response = fetch(url, {
        method: 'POST',
        mode: 'cors',
        cache: 'no-cache',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8;'
        },
        body: formOrder
    })
        .then((response) => {
            return response.json();
        }).catch((e) => console.log(e.message));
    console.log('buttonAddOrder', response);
   
});
Видимо AntiForegnToken в форме передается

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения


Ответы (1 шт):

Автор решения: Zerg Zerg

Может кому будет полезно, подсказали два варианта решения.

1.From Body:

View

 <form id="formToStore" method="post" enctype="multipart/form-data">
          <input type="hidden" name="cardId" id="cardId" value="1" /> 
          <input type="hidden" name="userId" value="466788cb-6aab-4798-81f1-f6b05cb71e32"/>

          <div class="modal-footer">
            <button type="button" id="buttonclose" name="buttonclose" class="buttonclose btn btn-secondary" data-bs-dismiss="modal">Close</button>

            <button type="button" id="addToOrder" name="addToOrder" class="btn btn-primary">Add to Order</button>
          </div>
        </form>
        @section Scripts
        {
            <script>
                var buttonAddOrder = document.getElementById("addToOrder");    
                buttonAddOrder?.addEventListener("click", function () {
                    var catId = document.querySelector("#formToStore input[name = 'cardId']").value;
                    var userId = document.querySelector("#formToStore input[name = 'userId']").value;
                    var antiForgeryToken = document.querySelector("#formToStore input[name = '__RequestVerificationToken']").value;
                    var itemsStore = {
                       // __RequestVerificationToken: antiForgeryToken,  //remove this....
                       UserId:userId,
                       CatrgoryId: catId,
                       Payed: false
                    };
                    var url = "/CategoriesToUser/AddItemToStore";          
                    var response = fetch(url, {
                        method: 'POST',
                        mode: 'cors',
                        cache: 'no-cache',
                        headers: {
                            'Content-Type': 'application/json',          //change here...
                            "X-ANTI-FORGERY-TOKEN": antiForgeryToken,    //add this.....    
                        },
                        body: JSON.stringify(itemsStore)          //change here.....                   
                    })
                    .then((response) => {
                        return response.json();
                    }).catch((e) => console.log(e.message));

                })
            </script>
        }

Controller

 [HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddItemToStore([FromBody] StoreUser itemsStore)
{
    //do your stuff....
    return Ok(itemsStore);
}

Startup.cs:

 services.AddAntiforgery(x => x.HeaderName = "X-ANTI-FORGERY-TOKEN");

2.From Form:

View

 <form id="formToStore" method="post" enctype="multipart/form-data">

                          @*change name="cardId" to name="CatrgoryId"*@
      <input type="hidden" name="CatrgoryId" id="cardId" value="1" />  
      <input type="hidden" name="userId" value="466788cb-6aab-4798-81f1-f6b05cb71e32"/>
      <div class="modal-footer">
        <button type="button" id="buttonclose" name="buttonclose" class="buttonclose btn btn-secondary" data-bs-dismiss="modal">Close</button>
        <button type="button" id="addToOrder" name="addToOrder" class="btn btn-primary">Add to Order</button>
      </div>
    </form>
    @section Scripts
    {
        <script>
            var buttonAddOrder = document.getElementById("addToOrder");
            buttonAddOrder?.addEventListener("click", function () {
            var url = "/CategoriesToUser/AddItemToStore";
            const  formToStore = document.getElementById('formToStore');
            var formOrder = new FormData(formToStore);

            let response = fetch(url, {
                method: 'POST',
                mode: 'cors',
                cache: 'no-cache',
                //headers: {
                //    'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8;'
                //},                             //don't need to set the Content-Type header
                body: formOrder   
            })
                .then((response) => {
                    return response.json();
                }).catch((e) => console.log(e.message));

            })
        </script>
    }

Controller Меняем [FromBody] на [FromForm]

   [HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddItemToStore([FromForm] StoreUser itemsStore)
{
return Ok(itemsStore);

}

→ Ссылка