You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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.com
  • X-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 20:52:02