如何在SwaggerUI中通过Swashbuckle显示IdentityServer端点
解决方案:将Duende IdentityServer 6端点添加到Swagger UI
要把Duende IdentityServer的/connect/token、/connect/authorize等内置端点展示在Swagger UI中,可通过以下两种方式实现:
方式一:使用Duende官方Swagger扩展(推荐)
这是最简便的方案,Duende提供了专门的扩展包自动生成IdentityServer端点的OpenAPI定义。
1. 安装NuGet包
Install-Package Duende.IdentityServer.Swashbuckle
2. 修改SwaggerGen配置
更新你的AddSwaggerGen代码,添加Duende的Swagger集成逻辑:
builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" }); // 自动导入IdentityServer所有端点的OpenAPI定义 c.DuendeIdentityServerSwaggerGen(); // 保留原有OAuth2安全定义 c.AddSecurityDefinition("oauth2", new OpenApiSecurityScheme { Type = SecuritySchemeType.OAuth2, Flows = new OpenApiOAuthFlows { ClientCredentials = new OpenApiOAuthFlow { AuthorizationUrl = new Uri($"{builder.Configuration["BaseUri"]}connect/authorize", UriKind.RelativeOrAbsolute), TokenUrl = new Uri($"{builder.Configuration["BaseUri"]}connect/token", UriKind.RelativeOrAbsolute), Scopes = new Dictionary<string, string> { { Constants.Api.ScopeName, "Base level access to API" } } } } }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "oauth2" } }, new[] { Constants.Api.ScopeName } } }); });
3. 配置SwaggerUI中间件
在Program.cs中补充SwaggerUI的OAuth2客户端配置,方便直接在UI中测试授权流程:
app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"); // 替换为你的IdentityServer客户端ID c.OAuthClientId("your-swagger-client-id"); c.OAuthAppName("API Swagger UI"); // 若使用授权码流,开启PKCE模式 c.OAuthUsePkce(); });
方式二:手动添加端点定义(无官方包依赖)
如果不想引入额外包,可以通过自定义文档过滤器手动为IdentityServer端点编写OpenAPI定义。
1. 创建自定义文档过滤器
public class IdentityServerEndpointsFilter : IDocumentFilter { public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // 添加/connect/token端点定义 swaggerDoc.Paths.Add("/connect/token", new OpenApiPathItem { Post = new OpenApiOperation { Tags = new List<OpenApiTag> { new OpenApiTag { Name = "IdentityServer" } }, Summary = "获取访问令牌", RequestBody = new OpenApiRequestBody { Content = new Dictionary<string, OpenApiMediaType> { ["application/x-www-form-urlencoded"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["grant_type"] = new OpenApiSchema { Type = "string", Enum = new List<IOpenApiAny> { new OpenApiString("client_credentials"), new OpenApiString("password") } }, ["client_id"] = new OpenApiSchema { Type = "string" }, ["client_secret"] = new OpenApiSchema { Type = "string" }, ["scope"] = new OpenApiSchema { Type = "string" } }, Required = new HashSet<string> { "grant_type", "client_id" } } } } }, Responses = new OpenApiResponses { ["200"] = new OpenApiResponse { Description = "成功获取令牌", Content = new Dictionary<string, OpenApiMediaType> { ["application/json"] = new OpenApiMediaType { Schema = new OpenApiSchema { Type = "object", Properties = new Dictionary<string, OpenApiSchema> { ["access_token"] = new OpenApiSchema { Type = "string" }, ["token_type"] = new OpenApiSchema { Type = "string" }, ["expires_in"] = new OpenApiSchema { Type = "integer" }, ["scope"] = new OpenApiSchema { Type = "string" } } } } } } } } }); // 可按照相同逻辑添加/connect/authorize等其他端点 } }
2. 注册过滤器到SwaggerGen
builder.Services.AddSwaggerGen(c => { // ... 原有配置 ... c.DocumentFilter<IdentityServerEndpointsFilter>(); });
注意事项
- 使用官方扩展时,需确保IdentityServer的CORS配置允许Swagger UI的访问地址,同时客户端的
RedirectUris需包含Swagger UI的回调地址(如https://localhost:xxxx/swagger/oauth2-redirect.html)。 - 生产环境中避免硬编码客户端密钥,可通过配置文件注入。
内容的提问来源于stack exchange,提问作者achill113
相关产品推荐
相关产品推荐

