.NET Core中如何在Swagger文档区分需授权与公开接口
解决Swagger无法区分.NET Core Web API授权/公开端点的问题
看起来你遇到的问题是Swagger默认把所有端点都标记为受保护状态,这通常是因为两个原因:要么你的API全局启用了授权但公开端点没加[AllowAnonymous],要么Swagger配置里错误地全局应用了安全要求。下面是具体的解决步骤:
步骤1:给公开端点添加[AllowAnonymous]特性
你的GetEmpresas方法是公开的,但没有明确告诉Swagger它不需要授权。只需要给这个方法加上[AllowAnonymous]特性,就能让Swagger识别它是公开端点:
/// <summary> /// Obtener listado de Empresas disponibles para el cliente ID /// </summary> /// <remarks>Metodo público sin TOKEN</remarks> [HttpGet] [AllowAnonymous] // 新增:标记此端点无需授权 [ProducesResponseType(StatusCodes.Status200OK, Type = typeof(IEnumerable<EmpresasBase_model>))] [ProducesResponseType(StatusCodes.Status404NotFound)] public async Task<IActionResult> GetEmpresas([FromQuery][Required] string clientId) { var empresas = await service.GetEmpresas(clientId); return new ObjectResult(empresas); }
步骤2:正确配置Swagger的JWT安全定义和要求
接下来要确保Swagger的配置能正确识别[Authorize]和[AllowAnonymous]特性。在你的Program.cs(或.NET 5及更早版本的Startup.cs)中,调整AddSwaggerGen的配置:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "OhmioApi", Version = "v1" }); // 定义JWT安全方案 var jwtSecurityScheme = new OpenApiSecurityScheme { Name = "Authorization", Description = "Ingrese su token JWT en el formato: Bearer {token}", In = ParameterLocation.Header, Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", Reference = new OpenApiReference { Id = JwtBearerDefaults.AuthenticationScheme, Type = ReferenceType.SecurityScheme } }; c.AddSecurityDefinition(jwtSecurityScheme.Reference.Id, jwtSecurityScheme); // 配置安全要求:让Swagger根据端点的[Authorize]特性自动应用,而非全局强制 c.AddSecurityRequirement(new OpenApiSecurityRequirement { { jwtSecurityScheme, Array.Empty<string>() } }); // 可选:启用XML注释,让Swagger显示方法的summary和remarks var xmlFileName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlFilePath = Path.Combine(AppContext.BaseDirectory, xmlFileName); c.IncludeXmlComments(xmlFilePath); });
为什么这样有效?
[AllowAnonymous]会覆盖全局的授权策略,明确告诉Swagger这个端点不需要任何认证就能访问。- 调整后的Swagger安全配置不会全局强制所有端点使用JWT授权,而是会自动检测每个端点是否带有
[Authorize]特性:带有该特性的端点(比如你的GetEmpresa)会显示锁图标,而带[AllowAnonymous]的端点则会正常显示为公开状态。
最后,重新启动你的API,打开Swagger页面就能看到两个端点的状态已经正确区分了——GetEmpresas没有锁,GetEmpresa带有锁标记。
内容的提问来源于stack exchange,提问作者ericpap
相关产品推荐
相关产品推荐

