You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的ASP.NET Core应用不接受手动生成的防伪令牌?

问题根因及修复方案

1. 令牌取值错误

你在GetHeaderToken接口中返回的是JSON序列化后的令牌字符串,前端直接取x.responseText会得到带双引号的JSON格式值(例如"abcdef12345"),和实际令牌值不符,导致校验失败。
修复方法:前端拿到响应后先解析JSON:

complete: function(x)
{
     data["FieldToken"] = JSON.parse(x.responseText);
}

2. 自定义Ajax递归调用死循环

你重写了全局的$.ajax方法,在方法内部获取令牌时又调用了$.ajax,会触发无限递归,根本无法正常拿到令牌值。
修复方法:在重写前先缓存原生jQuery ajax方法,内部获取令牌时调用原生方法:

// 先缓存原生ajax方法
const originalAjax = $.ajax;
$.ajax = function(options)
{
    return new Promise(async (resolve, reject) =>
    {
        var xhr = new XMLHttpRequest();
        xhr.open(options.method, options.url, true);
        // ...原有逻辑
        if ($tokenField.length === 0)
        {
            // 调用原生ajax避免递归
            await originalAjax({
                url: 'Token/GetHeaderToken',
                method: 'get',
                complete: function(x)
                {
                     data["FieldToken"] = JSON.parse(x.responseText);
                }
            });
        }
        // ...原有逻辑
    });
};

3. 确保防伪Cookie正常携带

如果你的请求存在跨域场景,需要在xhr配置中开启withCredentials = true,否则CookieToken不会被携带到服务端,导致令牌和Cookie不匹配校验失败:

xhr.open(options.method, options.url, true);
xhr.withCredentials = true; // 新增这行

4. 可选优化:请求头传令牌更适配Ajax场景

你已经配置了options.HeaderName = "HeaderToken",如果不需要表单提交的话,直接把令牌放到请求头里更方便,不需要处理表单字段:

// 获取到令牌后加到请求头
xhr.setRequestHeader("HeaderToken", 令牌值);

内容的提问来源于stack exchange,提问作者Mehdi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:45:02