HCRM博客

为何AntForgeryToken会报错?如何解决?

AntiForgeryToken报错详解

一、

AntiForgeryToken是ASP.NET中用于防止跨站请求伪造(CSRF)攻击的一种机制,它通过在表单提交时生成一个唯一的令牌,并在服务器端进行验证,从而确保请求的合法性和安全性,在使用AntiForgeryToken的过程中,开发者可能会遇到各种报错问题,本文将详细解析这些报错的原因,并提供相应的解决方案。

为何AntForgeryToken会报错?如何解决?-图1
(图片来源网络,侵权删除)

二、常见报错及原因分析

1. “未找到__RequestVerificationToken参数”

原因:前端表单中缺少@Html.AntiForgeryToken()方法生成的隐藏字段,或者AJAX请求未正确携带该令牌。

解决方案:确保在需要保护的表单或AJAX请求中添加@Html.AntiForgeryToken(),并确保AJAX请求正确获取并发送该令牌。

2. “提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户”

原因:用户登录后,未重新生成有效的AntiForgeryToken,导致旧的令牌与当前用户不匹配。

解决方案:在用户登录成功后,重新生成AntiForgeryToken并传递到前台,然后前台更新令牌值。

为何AntForgeryToken会报错?如何解决?-图2
(图片来源网络,侵权删除)

3. “令牌无效或已过期”

原因:可能由于令牌生成逻辑错误、过期时间设置不当或存储方式不正确导致。

解决方案:检查令牌生成和验证的逻辑,确保代码逻辑正确无误;检查令牌的过期时间设置,并根据需要进行调整;检查令牌的存储方式,确保能够正确地获取和验证令牌。

4. AJAX请求中的“400 Bad Request”

原因:AJAX请求未正确设置内容类型或数据格式,导致服务器无法正确解析请求数据。

解决方案:确保AJAX请求的内容类型设置为application/xwwwformurlencoded,并正确编码请求数据。

为何AntForgeryToken会报错?如何解决?-图3
(图片来源网络,侵权删除)

三、解决方案汇总

报错信息 原因分析 解决方案
未找到__RequestVerificationToken参数 前端表单中缺少隐藏字段或AJAX请求未正确携带令牌 确保添加@Html.AntiForgeryToken()并正确发送令牌
提供的防伪标记适用于其他基于声明的用户,而不适用于当前用户 用户登录后未重新生成有效的AntiForgeryToken 登录成功后重新生成并传递令牌到前台更新
令牌无效或已过期 令牌生成逻辑错误、过期时间设置不当或存储方式不正确 检查并修正令牌生成和验证逻辑、过期时间设置和存储方式
AJAX请求中的“400 Bad Request” AJAX请求未正确设置内容类型或数据格式 确保AJAX请求内容类型为application/xwwwformurlencoded并正确编码请求数据

四、FAQs

Q1: 如何在ASP.NET Core中全局启用AntiForgeryToken?

A1: 在Startup.cs文件的ConfigureServices方法中添加以下代码:

services.AddMvc(options => options.Filters.Add(new AutoValidateAntiforgeryTokenAttribute()));

这样,所有的POST请求都会自动应用ValidateAntiForgeryToken特性。

Q2: 如果AJAX请求中包含复杂的数据对象,如何正确发送AntiForgeryToken?

A2: 对于复杂的数据对象,可以使用JSON序列化的方式发送数据,并在AJAX请求头中单独设置__RequestVerificationToken的值。

var token = $('[name=__RequestVerificationToken]').val();
$.ajax({
    type: 'post',
    url: '/Test/AcceptList',
    data: JSON.stringify({ reqId: 'id', requestModel: [{ Id: 2, name: 'id2', money: 22, CreateTime: new Date('20210529 22:53:10') }, { Id: 1, name: 'id1', money: 11, CreateTime: new Date('20210529 12:53:10') }] }),
    contentType: 'application/json',
    dataType: 'json',
    beforeSend: function (xhr) {
        xhr.setRequestHeader("__RequestVerificationToken", token);
    },
    success: function (res) {
        if (res.code == 0)
            alert(res.msg);
    },
    error: function () { }
});

注意,此时需要在后端手动解析JSON数据并验证AntiForgeryToken。

分享:
扫描分享到社交APP
上一篇
下一篇