Подтвердить что ты не робот

Как включить @Html.AntiForgeryToken() при удалении объекта с помощью ссылки Удалить

i имеет следующий ajax.actionlink, который вызывает Delete action method для удаления объекта: -

 @if (!item.IsAlreadyAssigned(item.LabTestID))
        { 
        string i = "Are You sure You want to delete (" + @item.Description.ToString() + ") ?";
           @Ajax.ActionLink("Delete",
       "Delete", "LabTest",
      new { id = item.LabTestID },

new AjaxOptions
{ Confirm = i,
    HttpMethod = "Post",
    OnSuccess = "deletionconfirmation",
    OnFailure = "deletionerror"
})
} 

, но есть ли способ включить @Html.AntiForgeryToken() с вызовом удаления ajax.actionlink, чтобы убедиться, что ни один злоумышленник не может отправить запрос о ложном удалении?

BR

4b9b3361

Ответ 1

Вам понадобится помощник Html.AntiForgeryToken, который устанавливает cookie и испускает скрытое поле с тем же значением. При отправке запроса AJAX вам необходимо также добавить это значение в данные POST.

Итак, я бы использовал обычную ссылку вместо ссылки Ajax:

@Html.ActionLink(
    "Delete", 
    "Delete", 
    "LabTest", 
    new { 
        id = item.LabTestID
    }, 
    new { 
        @class = "delete",
        data_confirm = "Are You sure You want to delete (" + item.Description.ToString() + ") ?"
    }
)

а затем поместите скрытое поле где-нибудь в DOM (например, перед закрывающим тегом body):

@Html.AntiForgeryToken()

и, наконец, ненавязчиво AJAXify анкер удаления:

$(function () {
    $('.delete').click(function () {
        if (!confirm($(this).data('confirm'))) {
            return false;
        }

        var token = $(':input:hidden[name*="RequestVerificationToken"]');
        var data = { };
        data[token.attr('name')] = token.val();
        $.ajax({
            url: this.href,
            type: 'POST',
            data: data,
            success: function (result) {

            },
            error: function () {

            }
        });

        return false;
    });
});

Теперь вы можете украсить свое действие Delete атрибутом ValidateAntiForgeryToken:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Delete(int id)
{
    ...
}

Ответ 2

Изменение ответа Bronx:

$.ajaxPrefilter(function (options, localOptions, jqXHR) {
    var token, tokenQuery;
    if (options.type.toLowerCase() !== 'get') {
        token = GetAntiForgeryToken();
        if (options.data.indexOf(token.name)===-1) {
            tokenQuery = token.name + '=' + token.value;
            options.data = options.data ? (options.data + '&' + tokenQuery) 
                : tokenQuery;
        }
    }
});

в сочетании с этим ответом Jon White

function GetAntiForgeryToken() {
  var tokenField = $("input[type='hidden'][name$='RequestVerificationToken']");
  if (tokenField.length == 0) { return null; 
  } else {
  return {
     name: tokenField[0].name,
     value: tokenField[0].value
  };
}

Изменить извините - понял, что я снова изобретаю колесо здесь SO asp-net-mvc-antiforgerytoken-over-ajax/16495855 # 16495855