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

ASP.NET Core中Swagger UI 1.0如何自动设置登录返回的Auth Token?

自动让Swagger获取登录接口的Auth Token并填充认证

你可以通过自定义Swashbuckle过滤器+特性标记的方式实现这个需求,不用每次手动复制粘贴,具体步骤如下:

1. 定义标记Token属性的特性

先写一个简单的特性,用来标记DTO里的Token字段,告诉Swagger这是要自动提取的认证令牌:

[AttributeUsage(AttributeTargets.Property)]
public class SwaggerAutoAuthTokenAttribute : Attribute
{
}

然后把这个特性加到你的登录返回DTO的Token属性上:

public class LoginResponseDto
{
    [SwaggerAutoAuthToken]
    public string Token { get; set; }
    // 其他返回字段...
}

2. 编写Swagger操作过滤器

创建一个操作过滤器,用来识别登录接口,提取返回的Token并关联到Swagger的认证逻辑中:

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Reflection;

public class AutoAuthTokenOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 这里根据方法名判断是否为登录接口,你也可以改成按路由、自定义接口特性判断
        if (!context.MethodInfo.Name.Contains("Login"))
            return;

        // 解析接口返回的实际类型(处理Task包装的情况)
        var returnType = context.MethodInfo.ReturnType;
        if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
            returnType = returnType.GetGenericArguments()[0];

        // 查找带SwaggerAutoAuthToken特性的属性
        var tokenProperty = returnType.GetProperties()
            .FirstOrDefault(p => p.GetCustomAttribute<SwaggerAutoAuthTokenAttribute>() != null);
        if (tokenProperty == null)
            return;

        // 添加扩展标记,方便前端脚本识别
        operation.Extensions.Add("x-target-token", new OpenApiString(tokenProperty.Name));
        
        // 确保接口关联Bearer认证方案
        if (operation.Security == null)
            operation.Security = new List<OpenApiSecurityRequirement>();
        
        var securityScheme = new OpenApiSecurityRequirement
        {
            {
                new OpenApiSecurityScheme
                {
                    Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
                },
                Array.Empty<string>()
            }
        };
        operation.Security.Add(securityScheme);
    }
}

3. 配置Swashbuckle启用过滤器和认证方案

根据你的.NET版本,在配置Swagger的地方注册过滤器并设置JWT认证方案:

.NET 5及更早(Startup.cs)

public void ConfigureServices(IServiceCollection services)
{
    // 其他服务配置...
    
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API", Version = "v1" });
        
        // 注册自定义过滤器
        c.OperationFilter<AutoAuthTokenOperationFilter>();
        
        // 配置Bearer认证方案
        c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
        {
            Description = "JWT认证格式:Bearer {token}",
            Name = "Authorization",
            In = ParameterLocation.Header,
            Type = SecuritySchemeType.ApiKey,
            Scheme = "Bearer"
        });
    });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    // 其他中间件配置...
    
    app.UseSwagger();
    app.UseSwaggerUI(c =>
    {
        c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1");
        // 注入自定义脚本实现自动填充
        c.InjectJavascript("/swagger-ui/custom-token.js");
    });
}

.NET 6+(Program.cs)

var builder = WebApplication.CreateBuilder(args);

// 其他服务配置...

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API", Version = "v1" });
    c.OperationFilter<AutoAuthTokenOperationFilter>();
    c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Description = "JWT认证格式:Bearer {token}",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.ApiKey,
        Scheme = "Bearer"
    });
});

var app = builder.Build();

// 其他中间件配置...

app.UseSwagger();
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "你的API V1");
    c.InjectJavascript("/swagger-ui/custom-token.js");
});

app.Run();

4. 添加自定义JS脚本实现自动填充

在项目的wwwroot/swagger-ui目录下新建custom-token.js文件(没有目录就手动创建),写入以下逻辑:

window.addEventListener('load', function() {
    const ui = window.ui;
    // 遍历所有接口,找到登录接口并监听请求完成事件
    ui.getModel().apis.forEach(api => {
        api.operations.forEach(op => {
            const operationData = op.get('operation');
            // 通过之前添加的扩展标记识别需要自动提取Token的接口
            if (operationData?.extensions?.['x-target-token']) {
                op.on('execute', function(response) {
                    if (response.ok) {
                        response.json().then(data => {
                            const tokenKey = operationData.extensions['x-target-token'];
                            const token = data[tokenKey];
                            if (token) {
                                // 自动设置认证头
                                ui.authActions.authorize({
                                    Bearer: { value: `Bearer ${token}` }
                                });
                                console.log('Token已自动填充到认证头');
                            }
                        });
                    }
                });
            }
        });
    });
});

注意事项

  • 识别登录接口的逻辑可以根据你的实际场景调整,比如用自定义特性标记登录接口,比按方法名判断更可靠
  • 如果你的Swashbuckle版本较旧,可能需要微调OpenApi相关类的代码,比如部分属性命名可能略有差异
  • JS脚本里的Token字段会自动匹配DTO中标记的属性名,不用手动修改

内容的提问来源于stack exchange,提问作者Mr A28

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 06:33:25