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

如何在ASP.NET Core 6 API Swagger UI中显示端点所需JWT令牌角色

ASP.NET Core 5/6 在Swagger UI展示受保护接口允许访问角色的实现方案

不需要引入第三方Nuget包,直接用Swashbuckle自带的操作过滤器就能实现,核心逻辑是自动扫描控制器、接口上的授权特性,提取角色信息后追加到Swagger的接口描述中。

步骤1:编写自定义操作过滤器

新建类实现IOperationFilter接口,逻辑是抓取接口上的[Authorize]、[AllowAnonymous]特性,提取允许访问的角色列表,拼接成权限说明展示在接口详情里,同时自动补充401、403的响应说明,和Swagger自带的JWT授权调试功能联动。

using Microsoft.AspNetCore.Authorization;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Linq;
using System.Text;

public class AuthRolesOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 收集控制器和接口方法上的所有Authorize特性
        var authAttributes = context.MethodInfo.DeclaringType!
            .GetCustomAttributes(true)
            .Union(context.MethodInfo.GetCustomAttributes(true))
            .OfType<AuthorizeAttribute>()
            .ToList();

        // 存在AllowAnonymous特性的公开接口直接跳过
        var hasAllowAnonymous = context.MethodInfo.GetCustomAttributes(true)
            .OfType<AllowAnonymousAttribute>().Any()
            || context.MethodInfo.DeclaringType.GetCustomAttributes(true)
            .OfType<AllowAnonymousAttribute>().Any();
        if (hasAllowAnonymous || !authAttributes.Any()) return;

        // 提取、去重所有配置的允许角色
        var allowedRoles = authAttributes
            .Where(attr => !string.IsNullOrWhiteSpace(attr.Roles))
            .SelectMany(attr => attr.Roles.Split(',', StringSplitOptions.RemoveEmptyEntries))
            .Select(role => role.Trim())
            .Distinct()
            .ToList();

        // 拼接权限说明文本
        var descBuilder = new StringBuilder();
        descBuilder.AppendLine("### 🔐 访问权限要求");
        descBuilder.AppendLine("- 认证方式:JWT Bearer Token");
        if (allowedRoles.Any())
        {
            descBuilder.AppendLine($"- 允许访问角色:`{string.Join("`, `", allowedRoles)}`");
        }
        else
        {
            descBuilder.AppendLine("- 角色要求:所有已完成认证的登录用户均可访问");
        }

        // 把权限说明追加到原有接口描述的最前面,不覆盖自定义的接口注释
        operation.Description = descBuilder.ToString() + operation.Description;

        // 自动补充未授权、权限不足的响应状态码说明
        operation.Responses.TryAdd("401", new OpenApiResponse { Description = "请求未授权,缺少或存在无效JWT Token" });
        operation.Responses.TryAdd("403", new OpenApiResponse { Description = "请求已认证,但当前账号角色无访问权限" });

        // 给接口加锁标识,关联Swagger的JWT认证配置
        var bearerScheme = new OpenApiSecurityScheme
        {
            Reference = new OpenApiReference
            {
                Type = ReferenceType.SecurityScheme,
                Id = "Bearer"
            }
        };
        operation.Security = new List<OpenApiSecurityRequirement>
        {
            new OpenApiSecurityRequirement { [bearerScheme] = Array.Empty<string>() }
        };
    }
}

步骤2:注册过滤器到Swagger配置

找到项目里的Swagger服务注册段,.NET 6+在Program.cs,.NET 5在Startup.cs的ConfigureServices方法里,注册刚才写的过滤器,同时配置JWT安全定义,让Swagger页面支持直接输入Token调试接口。

builder.Services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API项目名称", Version = "v1" });
    
    // 注册角色展示过滤器
    options.OperationFilter<AuthRolesOperationFilter>();

    // 配置JWT授权输入框
    options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
    {
        Name = "Authorization",
        Type = SecuritySchemeType.Http,
        Scheme = "Bearer",
        BearerFormat = "JWT",
        In = ParameterLocation.Header,
        Description = "输入JWT Token完成授权,格式:Bearer {你的Token值}"
    });
});

效果说明

  • 所有标记[Authorize]的接口,会在描述区最顶部固定显示权限要求
  • 配置了[Authorize(Roles = "Admin,Editor")]的接口,会清晰列出所有允许访问的角色
  • 仅标记[Authorize]未指定角色的接口,会提示所有已登录用户可访问
  • 标记[AllowAnonymous]的公开接口不会显示权限相关提示
  • 不会覆盖你通过XML注释写的接口业务说明,只是在前面追加权限内容

适配注意点

  • 如果你是用自定义授权策略实现角色控制,没有把角色写在[Authorize]的Roles属性上,需要在过滤器里额外注入IAuthorizationPolicyProvider读取策略配置,提取其中的角色要求即可
  • 代码里做了角色去重处理,就算控制器和接口方法上都配置了角色,不会出现重复展示的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:12:29