.net core ValidateAntiForgeryToken特性 阻止跨站点请求伪造(CSRF) 示例
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 参数 或者该参数值不对。