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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:55:20