Как я могу настроить IdentityServer4 (DotNet Core) для работы в обратном прокси Nginx - PullRequest
0 голосов
/ 25 января 2019

Я опубликовал свой API, STS ID-сервера и веб-интерфейс в отдельных контейнерах Docker, и я использую контейнер nginx, чтобы действовать в качестве обратного прокси-сервера для обслуживания этих приложений. Я могу просмотреть каждый из них и даже открыть конечную точку обнаружения для STS. Проблема возникает, когда я пытаюсь войти в веб-портал, он пытается перенаправить меня обратно в STS для входа, но я получаю ERR_CONNECTION_REFUSED URL-адрес выглядит хорошо, я думаю, что это STS, который не доступен из перенаправление из веб-интерфейса.

Мой 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;
        }
    }
}

Веб-интерфейс перенаправляет на приведенный ниже URL-адрес, который работает нормально, если я захожу на него с помощью сервера STS без nginx.

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

1 Ответ

0 голосов
/ 30 января 2019

Нашел проблему.Контейнеры не могли видеть друг друга, потому что nginx не добавлял порт в URL.Я изменил это: 'proxy_set_header Host $ host;'Для этого: 'proxy_set_header Host $ host: $ server_port;'

...