如何在Duende Identity Server中使issuer与域名保持一致?
解决Duende Identity Server在Nginx反向代理下Issuer地址不正确的问题
这个问题的核心是Duende Identity Server(以下简称IS)无法获取到外部真实的访问地址,只能拿到Nginx转发过来的127.0.0.1:8080,所以需要从Nginx代理配置和IS自身配置两方面调整:
一、调整Nginx反向代理配置
在Nginx的server块中,给转发到IS的location添加必要的代理头,把外部真实的请求信息传递给IS:
server { listen 443 ssl; server_name example.com; # 替换成你的SSL证书路径 ssl_certificate /path/to/your/cert.pem; ssl_certificate_key /path/to/your/key.pem; location / { proxy_pass http://127.0.0.1:8080; # 关键:传递真实的外部请求信息 proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; # 常规代理优化配置 proxy_set_header Host $host; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection keep-alive; proxy_cache_bypass $http_upgrade; } }
这些头的作用:
X-Forwarded-Proto:告诉IS外部用的是HTTPS协议X-Forwarded-Host:告诉IS外部访问的域名是example.comX-Forwarded-Port:告诉IS外部端口是443
二、配置Duende Identity Server信任转发头
Duende IS默认会忽略代理头(防止恶意伪造),必须显式配置让它信任Nginx的代理请求:
1. ASP.NET Core层面配置(.NET 6+为例)
在Program.cs中,先添加转发头中间件的配置,再启动IS:
var builder = WebApplication.CreateBuilder(args); // 配置信任代理,生产环境建议指定Nginx的具体IP,不要用* builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.XForwardedHost; // 允许信任的代理IP,同一台机器就填127.0.0.1 options.KnownProxies.Add(IPAddress.Parse("127.0.0.1")); }); // 添加IS服务(保留你原有的Clients、Resources等配置) builder.Services.AddIdentityServer() .AddInMemoryClients(Config.Clients) .AddInMemoryIdentityResources(Config.IdentityResources) .AddInMemoryApiScopes(Config.ApiScopes) .AddDeveloperSigningCredential(); // 生产环境替换为正式证书 var app = builder.Build(); // 注意:必须在UseIdentityServer之前调用UseForwardedHeaders app.UseForwardedHeaders(); app.UseIdentityServer(); app.Run();
2. 可选:强制指定Issuer地址
如果上面的动态配置不生效,或者你的环境固定,可以直接硬编码Issuer地址:
builder.Services.AddIdentityServer(options => { options.IssuerUri = "https://example.com"; }) // 其他IS配置...
验证配置
重启Nginx和Duende IS服务后,访问https://example.com/.well-known/openid-configuration,检查issuer字段是否已经变为"https://example.com"。
内容的提问来源于stack exchange,提问作者M. Akar
相关产品推荐
相关产品推荐

