Шлюз Ocelot не может получить конфигурацию с сервера идентификации в docker compose - PullRequest
2 голосов
/ 07 мая 2020

У меня ошибка, и я не могу понять, почему это происходит.

У меня микросервисная архитектура работает в сети docker. Я пытаюсь настроить сервер идентификации с помощью фреймворка Identityserver4.

Есть прокси-пересылка на шлюз Ocelot. Клиент - это приложение angular.

Вход и выход из системы, а также получение токена доступа и токена идентификации проходят успешно, но когда я пытаюсь настроить аутентификацию в Ocelot, я получаю следующую ошибку.

DX20803: Unable to obtain configuration from: 'http://identityservice:5010/.well- 
known/openid-configuration'.
gateway_1               | System.InvalidOperationException: IDX20803: Unable to obtain 
configuration from: 'http://identityservice:5010/.well-known/openid-configuration'.
gateway_1               |  ---> System.IO.IOException: IDX20804: Unable to retrieve document 
from: 'http://localhost/auth/.well-known/openid-configuration/jwks'.
gateway_1               |  ---> System.Net.Http.HttpRequestException: Cannot assign 
requested address

docker -compose настроен таким образом

version: '3.0'

services: 
pricecalendarservice:
    build: 
        context: ./PriceCalendarService
    environment: 
        - ASPNETCORE_URLS=http://+:5002
        - RedisConnection=redis
gateway:
    build: 
        context: ./Gateway/
    environment: 
        - ASPNETCORE_URLS=http://+:5000
        - ID_URL=http://identityservice
frontend:
    build:
        context: ./SPA
        dockerfile: staging.dockerfile
itemmanagerservice: 
    build:
        ./ItemManagerService
    environment: 
        - ASPNETCORE_URLS=http://+:5003
        - IdentityUrl=http://identityservice
identityservice:
    build:
        context: ./IdentityServer/IdentityServer
    environment: 
        - DEV_URL=http://localhost
        - ASPNETCORE_ENVIRONMENT=Developmnet
        - ASPNETCORE_URLS=http://+:5010
        - IDENTITY_ISSUER=http://localhost/auth
        - RedisConnection=redis
    ports: 
        - 5010:5010
proxy:
    build:
        context: ./proxy
    ports: 
        - 80:80
redis:
    image: redis
    ports: 
        - 6379:6379

Identityserver настроен следующим образом

   string redisConnectionString = Environment.GetEnvironmentVariable("RedisConnection", 
      EnvironmentVariableTarget.Process);
        string prodEnv = Environment.GetEnvironmentVariable("PROD_URL");
        string devEnv = Environment.GetEnvironmentVariable("DEV_URL");
        string env = Environment.GetEnvironmentVariable("ASPNETCORE_URLS");
        string issuer = Environment.GetEnvironmentVariable("IDENTITY_ISSUER");

        var redis = ConnectionMultiplexer.Connect( redisConnectionString + ":6379");
        services.AddDataProtection()
            .PersistKeysToStackExchangeRedis( redis , "DataProtection-Keys")
            .SetApplicationName("product");
        services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
        {
            builder
                .WithOrigins("https:localhost:4200")
                .AllowAnyMethod()
                .AllowAnyHeader();
        }));


        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is 
      needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        var config = new Config();

        config.setEnvironemnt(devEnv);


        services.AddIdentityServer(options => {
                options.PublicOrigin = issuer;
            })

            .AddDeveloperSigningCredential()
            .AddInMemoryIdentityResources(config.GetIdentityResources())
            .AddInMemoryApiResources(config.GetApis())
            .AddInMemoryClients(config.GetClients())
            .AddTestUsers(config.GetUsers());

NB. эмитент установлен на "http://localhost/auth"

Прокси-сервер Nginx настроен со следующими настройками:

server {
    listen 80;


    location / {
        proxy_pass       http://frontend;
        proxy_redirect   off;
        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;
    }
        location /api/hub {
        proxy_pass       http://gateway:5000;
        proxy_redirect   off;
        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_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }

    location /api {
        proxy_pass       http://gateway:5000;
        proxy_redirect   off;
        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 Upgrade $http_upgrade;
        proxy_cache_bypass $http_upgrade;
        proxy_set_header Connection "upgrade";
    }


    location /auth {
        proxy_pass       http://gateway:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        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-Proto $scheme;
        proxy_cache_bypass $http_upgrade;
    }

   }

Конфигурация шлюза, как прочитано в документации на Документация Ocelot

var authenticationProviderKey = "TestKey";

                s.AddAuthentication()
                .AddIdentityServerAuthentication(authenticationProviderKey, x =>
                    {
                        x.Authority = "http://identityservice:5010";
                        x.RequireHttpsMetadata=false;

                    });
                /*
                options.TokenValidationParameters = new 
   Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    ValidAudiences = new[] {"item"}
                };
                */

               s.AddOcelot();
               s.AddSwaggerGen(swagger =>
        {
            swagger.SwaggerDoc("v1", new OpenApiInfo { Title = "PriceCalendarService" });
        });

Кажется, что шлюз, работающий внутри сети docker, не может получить доступ к серверу идентификации. Но я пробовал как URL-адрес, который вызывает angular, то есть

"http://localhost/auth"

, так и имя службы, работающей в docker, разными способами.

"http://identityservice:5010" 
"http://identityservice"

Но каким-то образом шлюз не может получить доступ к серверу идентификации для загрузки документа обнаружения.

Может ли кто-нибудь указать мне в любом направлении, как это сделать правильно.

...