IdentityServer4负载均衡下将发现页面HTTP URL转为HTTPS的优雅方案
解决IdentityServer4负载均衡后发现页面URL转HTTPS的优雅方案
我来给你分享最靠谱也最优雅的解决思路,这也是IdentityServer官方推荐的适配负载均衡场景的做法:
1. 配置ForwardedHeaders中间件识别转发请求
负载均衡器会把原始的HTTPS请求转发给后端的IdentityServer(HTTP协议),同时会通过X-Forwarded-Proto、X-Forwarded-For这类请求头传递原始请求的协议、客户端IP等信息。我们需要让IdentityServer识别这些头,这样它才能知道原始请求是HTTPS的。
在Startup.cs的ConfigureServices方法里添加配置:
services.Configure<ForwardedHeadersOptions>(options => { // 开启转发协议和客户端IP的识别 options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 这里一定要添加你的负载均衡器的IP/网段,防止恶意请求伪造转发头 options.KnownProxies.Add(IPAddress.Parse("192.168.1.100")); // 替换成你的负载均衡器IP // 如果是云厂商的负载均衡(比如AWS ALB、Azure LB),可以用网段配置更灵活 // options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("10.0.0.0"), 24)); });
然后在Configure方法里,必须把这个中间件放在所有其他中间件之前,尤其是IdentityServer中间件:
public void Configure(IApplicationBuilder app) { // 先处理转发头 app.UseForwardedHeaders(); // 再启动IdentityServer app.UseIdentityServer(); // 其他中间件... app.UseRouting(); app.UseAuthorization(); // ... }
2. 指定IdentityServer的公共Origin地址
为了彻底确保发现文档(.well-known/openid-configuration)里的所有URL都是HTTPS格式,我们可以直接给IdentityServer配置对外的公共地址。
在ConfigureServices配置IdentityServer的时候,设置PublicOrigin:
services.AddIdentityServer(options => { // 替换成你的负载均衡对外的HTTPS域名 options.PublicOrigin = "https://your-app-domain.com"; }) .AddInMemoryClients(Config.Clients) .AddInMemoryIdentityResources(Config.IdentityResources) .AddInMemoryApiScopes(Config.ApiScopes) .AddAspNetIdentity<ApplicationUser>();
如果不想硬编码,也可以从配置文件(比如appsettings.json)读取:
// 先注入IConfiguration public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 然后在AddIdentityServer里配置 services.AddIdentityServer(options => { options.PublicOrigin = Configuration["IdentityServer:PublicOrigin"]; }) // ...其他配置
为什么这是最优雅的方案?
这两种配置结合起来,既让IdentityServer能正确感知原始请求的协议(通过转发头),又直接指定了对外的公共地址,确保生成的所有端点URL都是HTTPS格式。完全符合IdentityServer的设计规范,没有hack式的修改,也能适配各种负载均衡场景(云厂商LB、自建LB都适用)。
内容的提问来源于stack exchange,提问作者ArdAtak
相关产品推荐
相关产品推荐

