为什么我的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
相关产品推荐
相关产品推荐

