ASP.NET Core Antiforgery Token без формы

Можно ли иметь токены антифальсификации без форм? У меня есть почтовый вызов ajax, который я хотел бы сделать, для которого требуется токен защиты от подделки. Однако большинство примеров, которые я видел, запрашивают формы. Это то, что у меня есть до сих пор:

<script>
    $(document).ready(function () {
        var SessionId = document.getElementById("Id").value;
        var form_data = {
            "SessionId": SessionId
        };
        $.ajax({
            url: "@Url.Action("GetHistory", @ViewContext.RouteData.Values["controller"].ToString())",
            method: "POST",
            data: JSON.stringify(form_data),
            contentType: "application/json",
            success: function (result) {
                console.info(result);
                var output = JSON.parse(result);
                for (var i = 0; i < output.length; i++) {
                    var p = document.createElement("span");
                    var q = document.createElement("li");
                    if (output[i].Mine == true) {
                        p.setAttribute("class", "Sender Me");
                        q.setAttribute("class", "Message");
                    } else {
                        p.setAttribute("class", "Sender");
                        q.setAttribute("class", "Message");
                    }
                    p.textContent = output[i].Name + " - " + moment(output[i].CreatedOn).format("DD-MM-YYYY HH:mm:ss");
                    q.textContent = output[i].Message;
                    document.getElementById("MessageList").appendChild(p);
                    document.getElementById("MessageList").appendChild(q);
                }

            },
            error: function (error) {
                console.info(error);
            }
        });

        $('#MessageList').stop().animate({
            scrollTop: $('#MessageList')[0].scrollHeight
        }, 2000);
        return false;
    });
</script>

Это просто получает ввод из текстового поля и кнопки, которая не прикреплена к форме.

Как это будет возможно? Токен Anti Forgery генерируется при отображении формы.

TanvirArjel 29.01.2019 13:08

Итак, если я сделаю вызов ajax без формы, будет ли мой вызов POST безопасным?

JianYA 29.01.2019 13:10

Не будь моим! но вы можете отправить форму с помощью ajax с токеном защиты от подделки.

TanvirArjel 29.01.2019 13:12

Это хорошо описано в официальные документы. Вы использовали описанный там подход?

Kirk Larkin 29.01.2019 13:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
1 552
3

Ответы 3

AntiforgeryToken предназначен для предотвращения подделки межсайтовых запросов. Так что вы должны действительно использовать его. Самый простой способ получить его в jQuery — отобразить на странице фиктивную скрытую форму. Затем вы можете использовать свой javaScript, чтобы скопировать токен из фиктивной формы и включить его в свой пост ajax.

Вам нужно добавить его вручную. Попробуй это:

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

А затем опубликуйте его со своими данными:

data: { __RequestVerificationToken: token, JSON.stringify(form_data) }

Обновлено:

Как упоминал @AndresAbel, вы можете скопировать токен из формы и отправить его в сообщении ajax:

@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "__AjaxAntiForgeryForm" })) { @Html.AntiForgeryToken() }

Затем в вашем сценарии:

var token = $('input[name = "__RequestVerificationToken"]', $('#__AjaxAntiForgeryForm')).val();

Затем отправьте его в ajax:

data: { __RequestVerificationToken: token, JSON.stringify(form_data) }

Не забудьте добавить аннотацию [ValidateAntiForgeryToken] для вашего метода в контроллере.

Привет! Ваш метод почти работает для меня. Я получаю сообщение об ошибке. Неожиданный токен из раздела data:{}. Что-то не так?

JianYA 29.01.2019 15:29

Запрос Ajax может отправить маркер защиты от подделки в заголовке запроса на сервер. См. решение в Обработка запросов Ajax в ASP.NET Core Razor Pages.

<script type = "text/javascript">
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
        }   
</script>
<script>
$(document).ready(function () {
    var SessionId = document.getElementById("Id").value;
    var form_data = {
        "SessionId": SessionId
    };

    var headers = {};
    headers['XSRF-TOKEN'] = gettoken();//header name could be changed
    $.ajax({
        url: "/Home/testPost",
        method: "POST",
        data: JSON.stringify(form_data),          
        headers:headers,
        contentType: "application/json",


        success: function (result) {
            console.info(result);
            //...
        },
        error: function (error) {
            console.info(error);
        }
    });
   //...

});

Затем вам нужно настроить службу защиты от подделки для поиска определенного вами заголовка XSRF-TOKEN:

public void ConfigureServices(IServiceCollection services)
{
  services.AddMvc();
  services.AddAntiforgery(o => o.HeaderName = "XSRF-TOKEN");
}

Конечно, вам нужно использовать правильную привязку модели и атрибут [ValidateAntiForgeryToken] для своего действия.

Другие вопросы по теме