ASP.NET Core IdentityServer4 HTTPS登录回调地址丢失主机名
故障场景与定位
部署环境
- 技术栈:ASP.NET Core v3 Web应用 + IdentityServer4 + Angular 8前端
- 部署方式:IdentityServer、业务应用MyApp分别部署在同一IIS实例的两个独立站点
- IdentityServer站点绑定地址:
192.168.100.10:8080(HTTP)、sso.mycompany.local:8443(HTTPS) - MyApp业务站点绑定地址:
192.168.100.10:80(HTTP)、app.mycompany.local:443(HTTPS)
- IdentityServer站点绑定地址:
故障表现
- HTTP访问模式(浏览器打开
http://192.168.100.10):完整登录流程正常,业务应用跳转IdentityServer登录、身份校验、回调跳转回业务应用全链路通畅,回调地址为完整的http://192.168.100.10/connect/authorize/callback?client_id=[xxx] - HTTPS访问模式(浏览器打开
https://app.mycompany.local):身份校验完成后流程中断,浏览器开发者工具中可以看到,IdentityServer发起的回调地址为残缺的https:///connect/authorize/callback?client_id=[xxx],缺失主机名与端口信息 - 两个站点的部署二进制文件、配置、前端资源完全一致,仅IIS站点绑定的访问规则不同
根因
IdentityServer4 基于当前请求元信息拼接回调重定向地址时,未正确识别IIS托管场景下的HTTPS请求的主机、协议信息,导致生成的绝对路径缺失主机段,最终形成空主机名的异常回调地址。
修复步骤
- 在IdentityServer项目的
Startup.cs配置管道的最靠前位置,启用ForwardedHeaders中间件,解析IIS转发的请求元信息public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 最优先执行转发头解析,避免后续管道读取到错误的请求信息 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost }); // 原有管道逻辑... } - 调整转发头的安全校验规则,允许识别来自本机IIS代理的转发请求,避免被默认的代理白名单拦截
public void ConfigureServices(IServiceCollection services) { services.Configure<ForwardedHeadersOptions>(options => { // 将本机回环地址加入已知代理列表,适配IIS进程内/进程外托管模式 options.KnownProxies.Add(IPAddress.Loopback); // 适配非标准端口的HTTPS场景,避免端口信息丢失 options.RequireHeaderSymmetry = false; }); // 原有服务注册逻辑... } - 兜底配置:在IdentityServer的客户端定义中,显式配置HTTPS场景下的回调白名单,不依赖运行时自动推导地址
- 将HTTPS对应的回调地址
https://app.mycompany.local/connect/authorize/callback加入客户端的RedirectUris配置列表,确保即使运行时地址推导异常,也能使用预设的有效回调地址完成跳转。
- 将HTTPS对应的回调地址
内容的提问来源于stack exchange,提问作者Genesio
相关产品推荐
相关产品推荐

