如何控制Identity Server发现文档中URI的协议类型
解决Identity Server 4发现文档中URL使用HTTP而非HTTPS的问题
问题原因
你在安全端点运行Identity Server 4时,/.well-known/openid-configuration发现文档里仅issuer字段是HTTPS协议,其余端点URL全为HTTP。这是因为Identity Server默认会根据**当前传入请求的协议(Scheme)**生成这些端点URL,IdentityServerOptions__IssuerUri仅覆盖了issuer字段,而你拼写错误的RequreSsl(正确参数名是RequireSsl)仅用于强制客户端通过HTTPS访问服务,并不会修改生成的URL协议。
修复方案
根据你的部署场景,可选择以下对应方法:
1. 配置反向代理传递HTTPS协议头
如果Identity Server部署在反向代理(如Nginx、IIS ARR、Apache)之后,需要让代理将原始请求的HTTPS协议传递给后端服务:
- Nginx:在代理配置中添加协议头:
proxy_set_header X-Forwarded-Proto $scheme; - IIS:在ARR的转发设置中启用"Forwarded Headers",并勾选"X-Forwarded-Proto"选项。
随后在Identity Server的Startup类中配置处理转发头:
public void ConfigureServices(IServiceCollection services) { // 处理代理传递的转发头,让Identity Server识别真实请求协议 services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedProto; // 将代理服务器IP添加到信任列表,防止伪造头攻击 options.KnownProxies.Add(IPAddress.Parse("你的代理服务器IP")); }); services.AddIdentityServer(options => { options.IssuerUri = "https://identity-test.xyz.com"; options.RequireSsl = true; // 注意参数名拼写正确 }) // 后续添加资源、客户端等Identity Server配置... } public void Configure(IApplicationBuilder app) { // 必须在UseIdentityServer之前调用该中间件 app.UseForwardedHeaders(); app.UseIdentityServer(); // 其他中间件配置... }
2. 强制Identity Server生成HTTPS URL
若无法修改代理配置,可直接指定公共Origin强制生成HTTPS地址:
services.AddIdentityServer(options => { options.IssuerUri = "https://identity-test.xyz.com"; options.RequireSsl = true; // 强制所有端点URL使用HTTPS协议 options.PublicOrigin = "https://identity-test.xyz.com"; }) // 后续Identity Server配置...
该参数会忽略请求自带的协议,直接用指定的Origin生成所有端点URL。
3. 检查部署环境的协议设置
如果直接部署在IIS上:
- 确保网站已绑定HTTPS证书,且开启了"要求SSL"选项;
- 检查
ASPNETCORE_URLS环境变量,不要仅设置HTTP地址(如http://*:5000),需包含HTTPS地址(如https://*:5001)。
验证修复
修改配置后重启服务,重新访问/.well-known/openid-configuration,检查所有端点URL是否已全部切换为HTTPS协议。
内容的提问来源于stack exchange,提问作者Nate Zaugg
相关产品推荐
相关产品推荐

