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

如何在.NET Core 7中为特定端点禁用Swagger授权

解决方案:通过自定义特性+OperationFilter实现声明式排除

步骤1:创建自定义排除特性

先定义一个特性,用来标记需要排除Swagger自动添加Authorization头的端点:

[AttributeUsage(AttributeTargets.Method)]
public class ExcludeSwaggerAuthorizationHeaderAttribute : Attribute
{
}

步骤2:实现IOperationFilter移除安全规则

编写OperationFilter逻辑,检查当前操作是否带有上述特性,若有则移除对应的Bearer安全要求:

public class ExcludeAuthorizationHeaderFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        var hasExcludeAttribute = context.MethodInfo
            .GetCustomAttributes(typeof(ExcludeSwaggerAuthorizationHeaderAttribute), false)
            .Any();
        
        if (hasExcludeAttribute)
        {
            // 移除所有Bearer类型的安全要求
            operation.Security = operation.Security?
                .Where(s => !s.ContainsKey("Bearer"))
                .ToList();
            
            // 如果没有剩余安全规则,直接清空
            if (!operation.Security?.Any() ?? true)
            {
                operation.Security = null;
            }
        }
    }
}

步骤3:注册Filter到Swagger配置

在Program.cs的Swagger配置中添加这个自定义Filter:

builder.Services.AddSwaggerGen(c =>
{
    // 其他Swagger配置(比如文档信息、XML注释等)
    
    // 注册自定义Filter
    c.OperationFilter<ExcludeAuthorizationHeaderFilter>();
    
    // 你的Bearer安全规则原有配置
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "JWT Authorization header using the Bearer scheme."
    });
    
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
            },
            Array.Empty<string>()
        }
    });
});

步骤4:给目标端点标记特性

在那个重定向到外部API的AllowAnonymous端点上,加上自定义的排除特性:

[Authorize]
public class YourController : ControllerBase
{
    [AllowAnonymous]
    [ExcludeSwaggerAuthorizationHeader]
    public IActionResult RedirectToExternalResource()
    {
        return Redirect("https://external-api.example.com/target-resource");
    }
    
    // 其他需要认证的端点...
}

关于之前Filter失效的说明

你之前尝试的IDocumentFilter/IOperationFilter没生效,大概率是逻辑没有精准匹配目标端点,或是没有正确移除对应的Bearer安全要求。这个方案通过声明式标记特性的方式,能精准定位需要排除的端点,逻辑清晰且和业务代码耦合度低,完全符合你要的声明式配置需求。

内容的提问来源于stack exchange,提问作者Viktor Chernodub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:55:18