Caddy反向代理后Duende IdentityServer的OpenID配置返回HTTP端点问题
问题根因
IdentityServer生成OIDC配置端点时,使用的请求协议来自Caddy向它发起的内部HTTP请求,因此所有端点默认使用http://前缀,和公网实际使用的HTTPS协议不一致。
方案实现
无需为IdentityServer单独配置证书,只要配置反向代理头转发和ASP.NET Core的转发头信任即可,两步即可解决:
1. 修改Caddyfile配置,透传公网请求信息
在反向代理规则中添加请求头转发,把公网的HTTPS协议、真实域名信息传给IdentityServer:
identity.fading-flame.com { reverse_proxy http://identity-server-prod { # 转发公网真实域名 header_up X-Forwarded-Host {host} # 转发公网真实协议为HTTPS header_up X-Forwarded-Proto https } }
2. 配置IdentityServer信任反向代理转发头
ASP.NET Core默认不会直接信任来自反向代理的转发头,需要显式配置UseForwardedHeaders中间件,注意该中间件必须放在所有其他中间件的最开头,包括UseRouting、UseIdentityServer等,同时删除你之前添加的UseHttpsRedirect中间件(内部通信走HTTP即可,加了会导致Caddy无法访问IdentityServer)。
首先在启动配置中添加转发头相关服务:
using Microsoft.AspNetCore.HttpOverrides; // 其他服务配置... services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; // Docker内部网络环境下可直接清空信任列表,允许所有内部代理的转发头 // 若需要更高安全性,可将Caddy容器的固定IP添加到KnownProxies中 options.KnownProxies.Clear(); options.KnownNetworks.Clear(); }); services.AddIdentityServer(options => { options.IssuerUri = $"https://{Environment.GetEnvironmentVariable("IDENTITY_BASE_URI")}"; options.EmitStaticAudienceClaim = true; }) // 其余IdentityServer配置不变...
然后在中间件管道最开头启用转发头:
var app = builder.Build(); // 必须放在第一行,优先处理转发头 app.UseForwardedHeaders(); // 后续其他中间件保持不变,不要加UseHttpsRedirect // app.UseHttpsRedirection(); // 删掉这行 app.UseRouting(); app.UseIdentityServer(); // 其他中间件...
验证效果
重启Caddy和IdentityServer容器后,再次访问/.well-known/openid-configuration,所有端点都会自动变为https://identity.fading-flame.com前缀,Blazor应用即可正常完成身份认证。
内容的提问来源于stack exchange,提问作者modmoto
相关产品推荐
相关产品推荐

