IdentityServer 4:在Nginx反向代理后面找不到连接/授权/回调地址



hi我是identityserver 4的新手,正在尝试在服务器上部署我的测试项目。我有客户端id和api项目,它们都是码头化的。经过身份服务器4和nginx反向代理配置的反复尝试,除了登录后的重定向回调之外,其他一切都正常工作。

故事:

在我的反向代理中,我有3个上行流,如下所示:
  1. 客户端APP,可通过url https://xxx.com/本身访问。并且它被配置为
location / {
proxy_pass http ://Client;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;

fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;

}

我将以下代码添加到管道行以设置原始url。没有这个,我得到了无效的重定向uri(在配置设置中,我用正确的地址设置了它,但错误的是,它显示它试图重定向到https://Client/signin-iodc(

app.Use(async (ctx, next) =>
{
ctx.Request.Scheme = "https";
ctx.Request.Host = new HostString("xxx.com");

await next();
});
  1. Identity Server 4,可通过基本URL https://xxx.com/Identity访问,并且我可以使用正确的地址正确获取配置。它被配置为
location /identity/ {
proxy_pass http ://Identity/;
proxy_buffering off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Port $server_port;
fastcgi_buffers 16 16k;
fastcgi_buffer_size 32k;
}

此处相同,将以下代码添加到管道行,以设置Identity server 的原始url

app.Use(async (ctx, next) =>
{
ctx.Request.Scheme = "https";
ctx.Request.Host = new HostString("xxx.com/identity/");

await next();
});

如果在openid配置中没有这个,我就有了错误的地址,比如https://identity/connect。。。。

  1. Api资源,这里没有问题,它可以在url https://xxx.com/Api/…上访问

上游:
upstream Client{
zone Client 64k;
server localhost:5001;
}

upstream Identity{
zone Identity 64k;
server localhost:9001;
}

问题:

现在有了这个配置,一切都正常了。我重定向到具有正确url的登录页面

https://xxx.com/identity/Account/Login?ReturnUrl=%。。。。。。

但登录后应该会进入

https://xxx.com/identity/connect/authorize/callback?client_id=

但它重定向到

https://xxx.com/connect/authorize/callback?client_id=

这是无效的,显然我得到的页面找不到。

如果我将身份添加到同一个url,它会正常工作,并转到客户端的主页,因为我有cookie和授权。

我不知道是我在这里添加了origin url的中间件,还是我错过了nginx中的一些配置。

问题出在我的中间件管道中。在我将身份服务器的基本url定义为之前

app.Use(async (ctx, next) => 
{ 
ctx.Request.Scheme = "https"; 
ctx.Request.Host = new HostString("xxx.com/identity/");

await next(); 
});

这很好。我得到了正确的发现配置和正确的url,还重定向到正确的url进行登录,并绕过identityserver,没有问题,除了登录后重定向的连接/授权,正如我在问题中解释的那样

我把它改成如下:

app.Use(async (ctx, next) => 
{ 
ctx.Request.Scheme = "https"; 
ctx.Request.Host = new HostString("xxx.com");
ctx.Request.PathBase = new PathString("/identity");
await next(); 
});

现在我的问题解决了。我不会把这个解决方案标记为答案,因为我不知道这是否是标准的解决方案和最佳实践。

最新更新