.NET 8 API中Swagger的Bearer安全定义不显示问题求助
.NET 8 API中Swagger Bearer认证配置问题排查
问题描述
我正在搭建新的.NET 8 API,使用Identity处理认证流程,却在配置Swagger的Bearer令牌认证时遇到问题。参考资料后我编写了如下Swagger配置代码:
builder.Services.AddSwaggerGen(options => { options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey }); options.OperationFilter<SecurityRequirementsOperationFilter>(); });
我已输入Bearer令牌,但仍无法使用授权功能。我了解到.NET 8中的Authorization/Identity有变更,旧教程可能已过时,我的Program.cs中认证相关代码如下:
builder.Services.AddAuthentication().AddBearerToken(IdentityConstants.BearerScheme); builder.Services.AddAuthorizationBuilder(); builder.Services.AddIdentityCore<User>() .AddEntityFrameworkStores<DatabaseContext>() .AddApiEndpoints();
请问是否是这部分代码导致的问题?
问题分析与解决方案
问题确实出在你提供的认证和Swagger配置代码中,以下是具体问题和修正方案:
1. 认证服务未指定默认方案
你当前的AddAuthentication()调用没有设置默认认证方案,导致.NET无法确定使用哪种认证方式处理Bearer令牌。修正代码如下:
// 指定默认认证方案为Identity提供的Bearer Scheme builder.Services.AddAuthentication(IdentityConstants.BearerScheme) .AddBearerToken(IdentityConstants.BearerScheme); builder.Services.AddAuthorizationBuilder(); builder.Services.AddIdentityCore<User>() .AddEntityFrameworkStores<DatabaseContext>() .AddApiEndpoints();
2. Swagger的Bearer安全定义配置不规范
原配置使用SecuritySchemeType.ApiKey不符合Bearer认证的标准规范,且缺少必要的Scheme说明。需要调整为SecuritySchemeType.Http并补充相关配置,同时直接添加安全要求替代原SecurityRequirementsOperationFilter(或确保Filter正确关联定义):
builder.Services.AddSwaggerGen(options => { options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.Http, Scheme = "Bearer", BearerFormat = "JWT", Description = "请输入Bearer令牌,格式为:Bearer {你的令牌内容}" }); // 添加安全要求,确保所有需要授权的接口都应用Bearer认证 options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); });
3. 确保中间件顺序正确
在Program.cs的中间件管道中,必须先添加认证中间件,再添加授权中间件,且要放在路由和Swagger中间件之前:
app.UseAuthentication(); app.UseAuthorization(); // 后续添加Swagger和路由中间件 app.UseSwagger(); app.UseSwaggerUI(); // 映射Identity的API端点(如果使用) app.MapIdentityApi<User>(); app.MapControllers();
完成以上调整后,重新启动API,在Swagger UI中输入Bearer {令牌}格式的认证信息,即可正常使用授权功能。
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

