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
相关产品推荐
相关产品推荐

