首页 > 技术文章 > .net core ValidateAntiForgeryToken特性 阻止跨站点请求伪造(CSRF) 示例

tomorrow0 2021-06-07 09:21 原文

1 后台控制器

        [ValidateAntiForgeryToken]
        public IActionResult AcceptList([FromForm]string reqId, [FromForm] List<RequestModel> requestModel)
        {
            return Json(new { code = 0, msg = "操作成功2" });
        }

2 前端代码

添加     @Html.AntiForgeryToken()

<div>
    <!--这段代码会生成如下元素
    <input name="__RequestVerificationToken" type="hidden" value="CfDJ8Iq1FkUsGUVDjXSXvr3mD_aBj_NbQuayfjr5Kp-DB_wgGvNNqR8aedZeHMIEcgfwSV4xqNxYjvxRlu_QX4oF2jXpSLlJ-m50T02iUPBeUKD6o7A1pV9VW68z6A7iPw_zYaCXmDqKCL4GTLIoheZD29E" />
    -->
    @Html.AntiForgeryToken()
</div>

ajax 请求代码

     //获取防伪标记
    var token = $('[name=__RequestVerificationToken]').val();
    // 后台接收 list
    $.ajax({
        type: 'post',
        url: '/Test/AcceptList',
        data: { __RequestVerificationToken: token,reqId: 'id', requestModel: [{ Id: 2, name: 'id2', money: 22, CreateTime: new Date('2021-05-29 22:53:10') }, { Id: 1, name: 'id1', money: 11, CreateTime: new Date('2021-05-29 12:53:10') }] },
        contentType: 'application/x-www-form-urlencoded',
        dataType: 'json',
        success: function (res) {
            if (res.code == 0)
                alert(res.msg);
        },
        error: function () {
        },
        beforeSend: function () {
        },
        complete: function () {
        }
    });

 

也可以全局启用这个特性:在 Startup.cs 文件中 ConfigureServices 添加如下代码

            // 为所有的 post 请求添加 ValidateAntiforgeryToken
            services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));

 如果后端加了ValidataAntiForgeryToken 前端请求报错 400 (Bad Request),原因是前端请求参数缺失 __RequestVerificationToken 参数 或者该参数值不对。

 

推荐阅读