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:
- 在
UseSwaggerUI中注入自定义脚本:
app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); c.ConfigObject.AdditionalItems.Add("supportsCredentials", true); c.InjectJavascript("/swagger-custom.js"); });
- 在项目
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
相关产品推荐
相关产品推荐

