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

Swashbuckle.AspNetCore下Swagger UI发送Cookie中Session ID被编码问题

解决方案

1. 修正Swagger安全定义为Cookie类型

当前配置将x-session-key设为请求头发送,与你需要通过Cookie传输的需求不符。需修改SecurityDefinition的In属性为Cookie,让Swagger UI正确把值放入Cookie中:

builder.Services.AddSwaggerGen(c =>
{
    c.AddSecurityDefinition("x-session-key", new OpenApiSecurityScheme
    {
        Type = SecuritySchemeType.ApiKey,
        In = ParameterLocation.Cookie, // 改为Cookie位置
        Name = "x-session-key",
        Description = "Session ID"
    });

    c.AddSecurityRequirement(new OpenApiSecurityRequirement()
    {
        {
            new OpenApiSecurityScheme
            {
                Reference = new OpenApiReference
                {
                    Type = ReferenceType.SecurityScheme,
                    Id = "x-session-key"
                }
            },
            new string[] {}
        }
    });    
});

2. 配置Swagger UI支持Cookie携带

针对Swashbuckle.AspNetCore 6.4.0,添加supportsCredentials配置确保请求能携带自定义Cookie:

app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    c.ConfigObject.AdditionalItems.Add("supportsCredentials", true);
});

3. 排查Cookie值异常问题

你观察到Request.Cookies中的值被编码,而Request.Headers中是原始值,核心原因是:

  • 之前的配置错误地将值发送到Header,而你后端可能同时从Header和Cookie取值,Request.Cookies中的值可能是旧的遗留Cookie,并非Swagger UI发送的新值。
  • ASP.NET Core默认会对Cookie值做URL编码/解码,但你的Session ID是纯十六进制字符串,不会触发编码变更。

验证方式:

  • 打开浏览器开发者工具(F12)→ Network标签,发送请求后查看请求头的Cookie字段,确认x-session-key的值是否为你输入的原始ID。
  • 后端代码明确仅从Request.Cookies["x-session-key"]取值,避免与Header取值逻辑混淆。

4. 强制Cookie值原样传输(可选)

如果仍存在编码问题,可通过自定义脚本拦截Swagger请求,手动添加未编码的Cookie:

  1. 在UseSwaggerUI中注入自定义脚本:
app.UseSwaggerUI(c =>
{
    c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
    c.ConfigObject.AdditionalItems.Add("supportsCredentials", true);
    c.InjectJavascript("/swagger-custom.js");
});
  1. 在项目wwwroot目录下创建swagger-custom.js文件,内容如下:
(function() {
    const originalFetch = window.fetch;
    window.fetch = function(resource, options) {
        // 移除可能残留的Header类型Session ID
        if (options?.headers) delete options.headers['x-session-key'];
        
        // 从Swagger授权存储中获取Session ID
        const sessionAuth = window.ui.api.clientAuthorizations.authSchemes.find(s => s.name === 'x-session-key');
        if (sessionAuth?.value) {
            // 手动添加Cookie,不进行编码
            document.cookie = `x-session-key=${sessionAuth.value}; path=/; SameSite=Lax`;
        }
        return originalFetch(resource, options);
    };
})();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 18:33:11