C# Swagger配置客户端凭证流后请求未携带Authorize头问题
问题根因
你遇到的问题由两个配置错误共同导致:
- 安全方案ID不匹配
AddSecurityDefinition方法的第一个参数是安全方案的唯一标识,你这里传入的是"oauth2",但后续AddSecurityRequirement中通过OpenApiReference引用安全方案时,传入的ID是JwtBearerDefaults.AuthenticationScheme(默认值为"Bearer")。Swagger UI通过ID关联已获取的令牌与接口安全校验规则,ID不一致时,授权流程可以正常完成,但令牌不会被自动注入请求头。 - 安全要求未关联对应权限范围(Scope)
你在OAuth2客户端凭证流中定义了"thescope"权限范围,但AddSecurityRequirement中传入的权限范围列表是空集合,Swagger UI会判定该安全要求无需关联已申请对应权限的令牌,因此不会触发令牌注入逻辑。
修复方案
将AddSecurityRequirement部分的配置修改为如下内容,保证方案ID一致、关联正确的权限范围即可:
c.AddSecurityRequirement(new OpenApiSecurityRequirement() { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, // 必须和AddSecurityDefinition第一个参数(方案ID)完全一致 Id = "oauth2" }, Scheme = "Bearer", In = ParameterLocation.Header }, // 传入OAuth2流中定义的权限范围 new List<string>() { "thescope" } } });
可选校验项
如果修改后仍存在问题,可以检查Swagger UI中间件配置,确认已配置对应OAuth2客户端参数(不需要硬编码密钥,仅配置客户端ID即可保证授权弹窗的默认值填充正常):
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "The API v1"); c.OAuthClientId("你的客户端ID"); c.OAuthScopeSeparator(" "); });
内容的提问来源于stack exchange,提问作者Richard Barraclough
相关产品推荐
相关产品推荐

