ASP.NET Core 8中Swagger JWT认证遇特殊JSON返回:Bearer undefined问题
解决Swagger OAuth2密码流适配嵌套JWT返回的问题
问题根源
Swagger UI默认会从OAuth2 token接口的顶层JSON字段读取access_token和token_type,但你的Login接口把这些核心字段嵌套在data对象里,导致Swagger无法正确解析token数据,进而出现「Bearer undefined」的授权头错误,以及端点显示锁定的问题。
解决方案:自定义Swagger Token解析逻辑
在ASP.NET Core 8的Program.cs中,通过注入自定义JavaScript脚本,修改Swagger UI的token响应处理逻辑,让它从data字段里提取所需的token信息:
配置SwaggerUI时引入自定义脚本
在AddSwaggerUI方法中添加自定义脚本注入,同时保留原有的OAuth2配置:builder.Services.AddSwaggerUI(options => { options.OAuthUsePasswordGrant(); options.OAuthClientId("your-client-id"); // 替换为你的实际客户端ID options.OAuthClientSecret("your-client-secret"); // 若有客户端密钥则替换 // 注入自定义JS脚本,覆盖默认token解析逻辑 options.InjectJavascript("/swagger-custom.js"); });创建自定义脚本文件
wwwroot/swagger-custom.js
在项目的wwwroot目录下新建该文件,写入以下代码重写token解析逻辑:// 覆盖Swagger UI默认的token获取后处理逻辑 window.ui = window.ui || {}; ui.initOAuth = function(config) { const originalFetchToken = ui.authActions.fetchToken; ui.authActions.fetchToken = function(url, opts) { return originalFetchToken(url, opts).then(response => { // 从嵌套的data字段中提取token信息 if (response.data) { return { access_token: response.data.access_token, token_type: response.data.token_type || 'Bearer', expires_in: response.data.expires_in, refresh_token: response.data.refresh_token }; } return response; }); }; };确保静态文件中间件顺序正确
要让Swagger能加载到自定义脚本,需在Program.cs的管道配置中,将静态文件中间件放在Swagger中间件之前:app.UseStaticFiles(); // 必须在UseSwaggerUI之前配置 app.UseSwagger(); app.UseSwaggerUI();
验证效果
启动项目后,在Swagger UI中使用密码流登录,此时Swagger会自动从data字段解析access_token和token_type,调用接口时会正确携带Bearer {token}格式的授权头,端点的锁定状态也会解除。
内容的提问来源于stack exchange,提问作者YaSecu
相关产品推荐
相关产品推荐

