Подтвердить анти-подделку ключ не работает с сообщением ajax - PullRequest
0 голосов
/ 26 февраля 2019

added Я пытался использовать токен проверки фальсификации с пост-запросом ajax, но ответом является то, что корневой элемент не найден.я удаляю маркер против подделки, он работает отлично.

Вот мой код: javascript;

  function Save() {
        let GroupName = GetElementValue("GroupName");
        let GroupId = GetElementValue("GroupId");
        var Group = {
            __RequestVerificationToken: gettoken(),
            GroupId: :1",
            GroupName: "My Group Name"
        };

        if (IsFormValid("GroupForm")) {
            AjaxPost("/Groups/AddGroup", Group).done(function () {
                GetGroups();
            });
        }
    }


     function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
   }

function AjaxPost(url, data) {
    return $.ajax({
        type: "post",
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        responseType: "json",
        url: url,
        data: JSON.stringify(data)
    });
}

Я также пробовал это:

$.ajax({
    type: "POST",
    url: "/Groups/AddGroup",
    data: {
        __RequestVerificationToken: gettoken(),
        GroupId: 1,
        GroupName: "please work"
    },
    dataType: 'json',
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',

});

Вот бэкэнд:

  [HttpPost]
        [ValidateAntiForgeryToken]
        public void AddGroup([FromBody] GroupView Group)
        {
            if (Group.GroupName.Trim().Length>0)
            {
                bool existed = _context.Groups.Any(x => x.GroupName.ToLower().TrimEnd().Equals(Group.GroupName.ToLower().TrimEnd()));
                if (!existed)
                {
                    Groups group = new Groups()
                    {
                        GroupName = Group.GroupName
                    };
                    _context.Groups.AddAsync(group);
                    _context.SaveChanges();
                    int? groupId = group.GroupId;
                }
            }
        }

Here is the parameter passing perfectly

А вот и мой класс GroupView

public class GroupView
{
    public string GroupId { get; set; }
    public string GroupName { get; set; }
}

Я хочу использовать метод, при котором я посылаю серийный токен со своими данными в обычном режиме, как я могу заставить его работать?любая помощь!

Ответы [ 3 ]

0 голосов
/ 26 февраля 2019

В ASP.NET Core вы можете передавать токен защиты от подделки либо через форму, либо через заголовки.Поэтому я могу предложить вам 2 решения.

Решение 1. Заголовки

Чтобы платформа могла считывать токен из заголовков, вам нужно настроить AntiforgeryOptions и установитьHeaderName до null значения.Добавьте этот код к Startup.cs

//or if you omit this configuration 
//HeaderName will be "RequestVerificationToken" by default
services.AddAntiforgery(options =>
{
    options.HeaderName = "X-CSRF-TOKEN"; //may be any other valid header name
});

и передайте токен защиты от подделки в AJAX

function Save() {
    //..
    //no need to set token value in group object
    var Group = {
        GroupId: "1",
        GroupName: "My Group Name"
    };
    //..
}

function AjaxPost(url, data) {
    return $.ajax({
        type: "post",
        contentType: "application/json;charset=utf-8",
        dataType: "json",
        responseType: "json",
        headers: {
            "X-CSRF-TOKEN": gettoken()
        },
        url: url,
        data: JSON.stringify(data)
});

Решение 2. Форма

YouЯ уже пытался передать токен через форму, но это не сработало.Зачем?Причина состоит в том, что реализация по умолчанию IAntiforgeryTokenStore (используется для чтения токенов из запроса) не может считывать токен защиты от подделки из json, а считывает его как данные формы.Если вы хотите, чтобы это работало, не запрашивайте данные stringify и не удаляйте свойство contentType из вызова $.ajax.JQuery установит соответствующий тип контента и сериализует данные соответственно для вас.

//all other original code is unchanged, group needs to contain a token
function AjaxPost(url, data) {
    return $.ajax({
        type: "post",
        dataType: "json",
        responseType: "json",
        url: url,
        data: data
});

Также вам нужно удалить атрибут [FromBody] из параметра действия, чтобы связыватель модели правильно связывал модель в этом случае

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddGroup(GroupView group)
0 голосов
/ 27 февраля 2019

Для FromBody он будет связывать модель с application/json, но CSRF не будет считывать токен из тела.

Для простоты вы можете добавить заголовок с помощью RequestVerificationToken.

Controller

[HttpPost("/Groups/AddGroup")]
[ValidateAntiForgeryToken]
public void AddGroup([FromBody] GroupView Group)
{
}

Client

<script type="text/javascript">
    $(document).ready(function(){
        var Group = {
            __RequestVerificationToken: gettoken(),
            GroupId: 1,
            GroupName: "My Group Name"
        };

        AjaxPost("/Groups/AddGroup", Group).done(function () {
            GetGroups();
        });

    });
    function gettoken() {
        var token = '@Html.AntiForgeryToken()';
        token = $(token).val();
        return token;
    }

    function AjaxPost(url, data) {
        return $.ajax({
            type: "post",
            contentType: "application/json;charset=utf-8",
            dataType: "json",
            responseType: "json",
            url: url,
            headers: {
                "RequestVerificationToken": gettoken()
            },
            data: JSON.stringify(data)
        });
    }
</script>
0 голосов
/ 26 февраля 2019

Вы должны сгенерировать токен в вашем ПРОСМОТРЕ в форме, подобной этой:

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

Затем вы можете получить значение токена в своем Javascript, например:

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

Наконец, вы можете отправить токен своему КОНТРОЛЛЕРУ через AJAX следующим образом:

$.ajax({
type: "POST",
url: "/Groups/AddGroup",
data: {
    __RequestVerificationToken: token ,
    GroupId: 1,
    GroupName: "please work"
},
dataType: 'json',
contentType: 'application/x-www-form-urlencoded; charset=utf-8',

});
...