Identity Server4发现端点通过HTTPS访问却返回HTTP链接问题排查
问题根因
当站点部署在反向代理和负载均衡后,ASP.NET Core默认接收的是Nginx转发过来的内网HTTP请求,即便用户端是HTTPS访问,程序没有正确识别原始请求的协议与域名,导致Identity Server4生成发现端点链接时使用了内部HTTP协议。
修复步骤
第一步:确认反向代理层头透传配置
首先确保负载均衡、Nginx两层都正确转发原始请求信息,Nginx的对应站点location配置中需添加如下规则:proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host;若前端负载均衡是独立服务,也需要配置相同的头透传规则,确保X-Forwarded系列头可以从用户端完整透传到.NET Core应用。
第二步:配置.NET Core转发头中间件
注意中间件注册顺序必须放在所有其他中间件之前,否则配置不生效- 在
ConfigureServices方法中添加转发头配置:
services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; // 可选:添加你的反向代理内网IP到信任列表,避免请求头伪造风险 options.KnownProxies.Add(IPAddress.Parse("你的Nginx/负载均衡内网IP")); });- 在
Configure方法的第一行注册转发头中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 必须放在最顶部,优先处理转发头 app.UseForwardedHeaders(); // 后续原有中间件,比如UseRouting、UseAuthentication、UseIdentityServer等 // ... }- 在
第三步:添加Identity Server4专属配置
若完成上述两步后问题仍存在,可直接强制指定IS4的公共访问域名,优先级最高:services.AddIdentityServer(options => { // 替换为你的线上正式访问域名,带HTTPS协议 options.PublicOrigin = "https://你的正式站点域名"; // 可选:若需要固定签发者标识,也可配置IssuerUri // options.IssuerUri = "https://你的正式站点域名"; }) // 你原有IS4的其他配置,比如AddInMemoryIdentityResources、AddAspNetIdentity等 // ...
验证方式
部署生效后访问/.well-known/openid-configuration发现端点,检查返回内容中的issuer、authorization_endpoint等字段前缀是否已经替换为HTTPS协议的正式域名。
内容的提问来源于stack exchange,提问作者Vman
相关产品推荐
相关产品推荐

