javascript - 验证防伪 key 不适用于ajax post

标签 javascript c# asp.net-core model-view-controller asp.net-ajax

added我尝试通过 ajax post 请求使用验证防伪 token ,但响应是找不到根元素。 我删除了防伪 token ,它工作得很好。

这是我的代码: 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

这是我的类(class) GroupView

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

我想使用正常发送串行 token 和数据的方法, 我怎样才能让它发挥作用? 任何帮助!

最佳答案

在 ASP.NET Core 中,您可以通过表单或 header 传递防伪 token 。所以我可以为您推荐 2 个解决方案。

解决方案 1. header

为了让框架从 header 读取 token ,您需要配置 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中传递防伪 token

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.表单

您已尝试通过表单传递 token ,但没有成功。为什么?原因是 IAntiforgeryTokenStore 的默认实现(用于从请求中读取 token )无法从 json 中读取防伪 token ,而是将其作为表单数据读取。如果您想让它工作,请不要 stringify 请求数据并从 $.ajax 调用中删除 contentType 属性。 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] 属性,以便在这种情况下让模型绑定(bind)器正确绑定(bind)模型

[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult AddGroup(GroupView group)

关于javascript - 验证防伪 key 不适用于ajax post,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54882487/

相关文章:

C# - IDataReader 到使用泛型的对象映射

c# - web请求如何检查用户是否成功登录

c# - 防止按钮点击事件,根据条件向Listview添加行

javascript - 文本字符串输出在第一个空格后停止,js/html

javascript - Testcafe:重复点击直到出现另一个元素

visual-studio - 调试 ASP.Net 应用程序时 Visual Studio 未启动浏览器

c# - GetTokenAsync 使用 auth0 在 ASP.NET Core 2.1 中返回 2 个受众

xamarin - ASP.NET Core Web API 与 ASP.NET Core 应用程序

Javascript 多级下拉菜单

javascript - 链接到 javascript 的 href