Как передать токен защиты от подделки и сериализованный объект в качестве параметра для действия MVC - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь передать токену AntiForgery и сериализованному сериализованному объекту в действие, но после всех попыток я все равно не могу.

Я попытался отправить их в виде параметров, разделенных запятыми, а также включить токен в строковый параметр.

var jsonModelData = JSON.stringify(
{       
    'personViewModel': serializedObject['PersonViewModel'],
    'identityUserViewModel': serializedObject['IdentityUserViewModel'],
    'entityPersonAddressViewModel' :  entityAddressSerializedObject['EntityPersonAddresses'],
    'telephoneViewModel': telephoneSerializedObject,
    'virtualAddressViewModel': virtualAddressSerializedObject
});

$.ajax({
    type: "POST",
    //contentType: "application/json; charset=utf-8",
    dataType: "json",
    url: "@Url.Action("Save")",
    data: { __RequestVerificationToken: token }, jsonModelData,
    success: function (data)
    {

, который работает против валидатора, но строковый параметр сериализованных объектов тогда равен нулю и затем также это (которое не проходит мимо [ValidateAntiForgeryToken])

var jsonModelData = JSON.stringify(
{
    '__RequestVerificationToken': token,
    'personViewModel': serializedObject['PersonViewModel'],
    'identityUserViewModel': serializedObject['IdentityUserViewModel'],
    'entityPersonAddressViewModel':      entityAddressSerializedObject['EntityPersonAddresses'],
    'telephoneViewModel': telephoneSerializedObject,
    'virtualAddressViewModel': virtualAddressSerializedObject
});

$.ajax({
    type: "POST",
    //contentType: "application/json; charset=utf-8",
    dataType: "json",
    url: "@Url.Action("Save")",
    data:  jsonModelData,

и Действие:

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Save(PersonViewModel personViewModel
                                 , IdentityUserViewModel identityUserViewModel
                                 , List<EntityPersonAddress> entityPersonAddressViewModel
                                 , List<TelephoneViewModel2> telephoneViewModel
                                 , List<VirtualAddressViewModel> virtualAddressViewModel)
{
}

Редактирование и решение:

Мне пришлось изменить параметр моего действия на именованный параметр с различными объектами, связанными в одном классе, и включить токен в качестве первого параметра в ajax, а также опустить ajax contentType для «application / json; etc».

Теперь это выглядит так.

$.ajax({
    type: "POST",
    dataType: "json",
    url: "@Url.Action("Save")",
    data: { __RequestVerificationToken: token, MultiViewModel: jsonModelData},

и Действие:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Save(PersonUserModel MultiViewModel) {

где PersonViewModel - это класс, который содержит все предыдущие и индивидуально заявленные viewModel.

Ответы [ 2 ]

0 голосов
/ 27 июня 2019

Ответил согласно Правке в вопросе:

0 голосов
/ 26 июня 2019

вы можете добавить заголовок к вашему вызову $ .ajax.

$.ajax({
type: "POST",    
headers: { "csrf-token": token }

заполните переменную токена чем-то вроде этого

@inject Microsoft.AspNetCore.Antiforgery.IAntiforgery Xsrf


  <script type="text/javascript">
    window.token = "@Xsrf.GetAndStoreTokens(Context).RequestToken";
  </script>
...