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

Swashbuckle.AspNetCore:如何在Swagger UI中隐藏请求后的密码明文?

解决Swagger UI请求后密码明文显示的问题

你已经通过ISchemaFilter给密码字段加上了"format": "password"实现输入掩码,但请求发送后密码明文出现在历史记录或响应里,可通过以下两种方式解决:

1. 自定义Swagger UI脚本拦截显示(推荐,直接处理前端展示)

在配置Swagger UI的时候,注入自定义JavaScript,把请求/响应里的密码字段替换为掩码文本:

app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    // 添加自定义脚本
    options.InjectJavascript("/swagger-ui/custom-script.js");
});

然后在wwwroot/swagger-ui目录下创建custom-script.js,内容如下:

// 拦截请求历史的显示
const originalRequestRender = window.ui.RequestsView.prototype.renderRequest;
window.ui.RequestsView.prototype.renderRequest = function(request) {
    const result = originalRequestRender.call(this, request);
    // 替换请求体里的password字段值
    return result.replace(/"password":"([^"]+)"/g, '"password":"***"');
};

// 拦截响应内容的显示
const originalResponseRender = window.ui.Response.prototype.renderBody;
window.ui.Response.prototype.renderBody = function(body) {
    if (typeof body === 'string') {
        // 替换响应里的password字段值
        body = body.replace(/"password":"([^"]+)"/g, '"password":"***"');
    }
    return originalResponseRender.call(this, body);
};

这个脚本会直接修改Swagger UI的请求历史和响应展示,把所有密码字段的明文替换成***,不会影响实际的API请求/响应数据,只是前端显示层面的处理。

2. 通过IOperationFilter修改API文档(后端控制字段显示)

如果想从Swagger文档层面就隐藏密码字段的响应内容,可以实现IOperationFilter,把响应里的密码字段标记为不显示:

public class HidePasswordResponseFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        // 遍历所有响应模型
        foreach (var response in operation.Responses.Values)
        {
            if (response.Content.TryGetValue("application/json", out var content))
            {
                foreach (var schema in content.Schema.Properties)
                {
                    // 匹配密码字段名(可根据你的模型调整字段名)
                    if (schema.Key.Equals("password", StringComparison.OrdinalIgnoreCase))
                    {
                        // 设置为只读隐藏,同时添加说明
                        schema.Value.ReadOnly = true;
                        schema.Value.Description = "敏感字段已隐藏";
                    }
                }
            }
        }
    }
}

然后在Swagger配置里注册这个过滤器:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    // 注册你已有的密码输入掩码过滤器
    c.SchemaFilter<PasswordSchemaFilter>();
    // 注册响应密码隐藏过滤器
    c.OperationFilter<HidePasswordResponseFilter>();
});

这种方式会让Swagger UI不展示响应里的密码字段,但如果是请求参数的历史记录,还是得配合第一种前端脚本处理。

注意事项

  • 第一种方案是纯前端处理,不会影响实际的API数据传输,适合只是不想在Swagger UI里明文展示的场景;
  • 第二种方案是从文档层面控制,适合需要在API文档里就隐藏敏感字段的场景;
  • 如果你的密码字段名不是password,要对应修改脚本和过滤器里的字段名匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 23:05:17