You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 08:07:49