如何配置 IdentityServer4 (DotNet Core) 在 Nginx 反向代理中工作

How can I configure IdentityServer4 (DotNet Core) to work in Nginx reverse proxy

我已经在单独的 docker 容器上发布了我的 API、ID 服务器 STS 和网络 ui,并且我正在使用 nginx 容器作为反向代理来提供服务这些应用程序。我可以浏览到它们中的每一个,甚至可以打开 STS 的发现端点。当我尝试登录 Web 门户时出现问题,它试图将我重定向回 STS 以进行登录,但我得到 ERR_CONNECTION_REFUSED url看起来不错 我认为这是从 Web 重定向中不可用的 STS UI。

我的docker-compose如下:

version: '3.4'

services:
  reverseproxy:
    container_name: reverseproxy
    image: nginx:alpine
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./proxy.conf:/etc/nginx/proxy.conf
      - ./cert:/etc/nginx
    ports:
      - 8080:8080
      - 8081:8081
      - 8082:8082
      - 443:443
    restart: always
    links:
      - sts
      sts:
    container_name: sts
    image: idsvrsts:latest
    links:
      - localdb
    expose:
      - "8080"

  kernel:
    container_name: kernel
    image: kernel_api:latest
    depends_on:
      - localdb
    links:
      - localdb

  portal:
    container_name: portal
    image: webportal:latest
    environment:
      - TZ=Europe/Moscow
    depends_on:
      - localdb
      - sts
      - kernel
      - reverseproxy

  localdb:
    image: mcr.microsoft.com/mssql/server
    container_name: localdb
    environment:
      - 'MSSQL_SA_PASSWORD=password'
      - 'ACCEPT_EULA=Y'
      - TZ=Europe/Moscow
    ports:
      - "1433:1433"
    volumes:
      - "sqldatabasevolume:/var/opt/mssql/data/"

volumes:
  sqldata:

这是 nginx.config:

worker_processes 1;

events { worker_connections 1024; }

http {

    sendfile on;
    upstream docker-sts {
        server sts:8080;
    }
    upstream docker-kernel {
        server kernel:8081;
    }
    upstream docker-portal {
        server portal:8081;
    }
    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate cert.pem;
    ssl_certificate_key key.pem;
    ssl_password_file global.pass;
    proxy_http_version 1.1;
    proxy_set_header   Upgrade $http_upgrade;
    proxy_set_header   Connection keep-alive;
    proxy_cache_bypass $http_upgrade;
    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Host $server_name;
    proxy_set_header X-Forwarded-Proto $scheme;

    server {
        listen 8080;
        listen [::]:8080;
        server_name sts;

        location / {
            proxy_pass         http://docker-sts;
            # proxy_redirect     off;
        }
    }

    server {
        listen 8081;
        listen [::]:8081;
        server_name kernel;

        location / {
            proxy_pass         http://docker-kernel;
        }
    }

    server {
        listen 8082;
        listen [::]:8082;
        server_name portal;

        location / {
            proxy_pass         http://docker-portal;
        }
    }
}

Web ui 重定向到下面 url,如果我使用没有 nginx 的 STS 服务器浏览到它,它工作正常。

http://localhost/connect/authorize?client_id=myclient.id&redirect_uri=http%3A%2F%2Flocalhost%3A22983%2Fstatic%2Fcallback.html&response_type=id_token%20token&scope=openid%20profile%20kernel.api&state=f919149753884cb1b8f2b907265dfb8f&nonce=77806d692a874244bdbb12db5be40735

发现问题。容器看不到对方,因为 nginx 没有在 url 上附加端口。 我改变了这个: 'proxy_set_header Host $host;' 对此: 'proxy_set_header Host $host:$server_port;'