ASP.NET Core 6 MVC中Ocelot网关未转发Authorization Header至API路由
核心原因
Ocelot默认不会自动转发Authorization这类认证相关请求头部,它内置了一套头部过滤规则,仅会转发部分标准HTTP头部,Authorization不在默认允许转发的列表中,因此会被自动剥离。
如果手动添加该头部后仍被剥离,大概率是因为Ocelot的路由配置里未明确声明允许该头部向下游传递,或是全局配置的头部过滤规则覆盖了你的手动设置。
解决步骤
- 路由配置中显式允许Authorization头部
修改Settings.json的路由配置,新增AllowedHeaders字段并加入Authorization:
{ "Routes": [{ "DownstreamPathTemplate": "/api/Admin/SurveyResult", "DownstreamScheme": "http", "DownstreamHostandPorts": [ { "Host": "localhost", "Port": "5276" } ], "UpstreamPathTemplate": "/api/Admin/SurveyResult", "UpstreamHttpMethod": [ "POST" ], "AllowedHeaders": ["Authorization", "Content-Type"] // 明确指定允许转发的头部 }]}
- 全局配置允许所有头部(可选)
如果需要所有请求头部都能向下游转发,可在Settings.json中添加全局配置:
{ "GlobalConfiguration": { "BaseUrl": "http://localhost:你的网关端口号", "AllowedHeaders": ["*"] // 允许所有头部通过 }, "Routes": [/* 你的路由配置 */] }
- 检查中间件顺序
确保UseOcelot()的调用顺序正确,当前代码中app.UseCors()在UseOcelot()之前是合理的,但如果存在其他自定义头部处理中间件,要确认它们不会移除Authorization头部。
验证方式
可在Ocelot网关中添加中间件,打印下游请求头部确认是否转发成功:
// 在UseOcelot()之前插入该中间件 app.Use(async (context, next) => { await next(); if (context.Items.ContainsKey("DownstreamRequest")) { var downstreamReq = context.Items["DownstreamRequest"] as HttpRequestMessage; if (downstreamReq != null) { Console.WriteLine("下游请求Authorization头部:" + downstreamReq.Headers.Authorization?.ToString()); } } }); await app.UseOcelot();
内容的提问来源于stack exchange,提问作者Hamzah Saleem
相关产品推荐
相关产品推荐

