请求标头未转发到 IdentityServer4
Posted
技术标签:
【中文标题】请求标头未转发到 IdentityServer4【英文标题】:Request header are not forwarding to IdentityServer4 【发布时间】:2020-01-29 21:49:45 【问题描述】:我使用 ocelot 作为我的微服务的 API 网关,使用 IdentityServer4 进行身份验证。在 ocelot 配置文件中,我添加了“AuthenticationOptions”并设置了 api 密钥。在 Startup 中,我添加了身份服务器。在身份服务器中,我使用标头中的值来动态构建连接字符串。当我发送获取令牌的请求时,可以在身份服务中访问标头。但是当我使用令牌发送下一个请求时,原始标头不可用。在身份服务中只能看到“主机”标头。
有没有办法在将请求路由到身份服务器时保留原始标头?
Startup.cs(添加身份服务器)
services
.AddAuthentication()
.AddIdentityServerAuthentication("APIParts", options =>
options.Authority = "http://localhost:60168";
options.RequireHttpsMetadata = false;
options.ApiName = "Parts";
options.SupportedTokens = SupportedTokens.Both;
);
ocelot.json
ReRoutes": [
"DownstreamPathTemplate": "/connect/token",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 60168
],
"UpstreamPathTemplate": "/token",
"UpstreamHttpMethod": [ "Post" ]
,
"DownstreamPathTemplate": "/api/Parts/Inventory",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
"Host": "localhost",
"Port": 65241
],
"UpstreamPathTemplate": "/api/Parts/Inventory",
"AuthenticationOptions":
"AuthenticationProviderKey": "APIParts",
"AllowedScopes": []
]
【问题讨论】:
在深入探讨之前,您能否解释一下为什么要使用不同的端口来进行 Identity Server 身份验证和 API?我认为可能存在问题,因为当生成 API 请求时,身份授权尝试在 API 所在的同一端口上验证令牌,所以你可以给两个相同的端口并尝试一下。 您能否发布一些代码来显示您如何尝试访问标头以构建连接字符串?此外,您要阅读什么标题?如果是主机标头,您将遇到问题。 【参考方案1】:我不熟悉 Ocelot,但在我的架构中,我的 IdentityServer 在负载均衡器后面运行,并通过 nginx Ingress 在 Kubernetes 集群中路由,这需要我在 IdentityServer 的 Startup.Configure
方法中配置标头转发,如下所示:
var forwardOptions = new ForwardedHeadersOptions
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
RequireHeaderSymmetry = false
;
forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
【讨论】:
以上是关于请求标头未转发到 IdentityServer4的主要内容,如果未能解决你的问题,请参考以下文章
RestController - 将 POST 请求转发到外部 URL
javascript 节点脚本将所有http请求转发到另一个服务器,并使用access-control-allow-origin标头返回响应。关注redi