hi我是identityserver 4的新手,正在尝试在服务器上部署我的测试项目。我有客户端id和api项目,它们都是码头化的。经过身份服务器4和nginx反向代理配置的反复尝试,除了登录后的重定向回调之外,其他一切都正常工作。
故事:
在我的反向代理中,我有3个上行流,如下所示:- 客户端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();
});
- 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。。。。
- 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();
});
现在我的问题解决了。我不会把这个解决方案标记为答案,因为我不知道这是否是标准的解决方案和最佳实践。