Интеграция Ocelot с Azure Аутентификацией Active Directory. Net Core 3.1 - PullRequest
1 голос
/ 15 февраля 2020

Контекст: Моя компания переходит на API-шлюз для управления всеми нашими услугами или услугами в нашей сети. Каждая служба в настоящее время аутентифицируется с использованием azure AD. Все является одним арендатором и просто позволяет пользователям компании. Вопрос: Правильно ли я понимаю? Проблема: Когда я звоню http:localhost: 5000 / authResource / get, я получаю ответ 401 от Ocelot. После прохождения ошибки я вижу, что я получаю нулевое значение, когда промежуточное программное обеспечение Ocelot Authentication пытается аутентифицироваться с использованием схемы AzureADJwtBearer.

Я следовал советам из вопросов, связанных с Ocelot и azure ad, но даже после что я не могу заставить что-либо работать. (В основном из этого ответа: Как настроить шлюз Ocelot Api с Azure Active Directory ) Я думаю, что я могу неправильно понять, как должна работать аутентификация. Насколько я понимаю, я говорю Ocelot для аутентификации на одном из моих Apis, используя схему AzureADJwtBearer. В моей конфигурации у меня есть информация для этой настройки c api (ClientId, TenantId, et c).

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

После перенаправления вернемся к Ocelot Я полагаю (это та часть, на которой я нечеткая), я ожидаю, что ocelot сохранит маркер доступа, который Microsoft отправляет обратно ДЛЯ СПЕЦИФИКАЦИИ C РЕСУРСА, КОТОРЫЙ Я ПРОСТО ЗАПРОСИЛ. Затем я ожидаю, что ocelot присоединит токен к заголовку Auth, а затем отправит запрос на ресурс, который я изначально запрашивал.

Чтобы пояснить это, я включу код, который у меня есть для моих файлов запуска, и мой файл ocelot. json. Из файла Startup.cs

public void ConfigureServices(IServiceCollection services)
        {

            services.AddProtectedWebApi(Configuration)
                .AddProtectedApiCallsWebApis(Configuration)
                .AddInMemoryTokenCaches();
            services.AddOcelot(Configuration);
            services.AddControllers();
        }

Также из файла Startup.cs

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }

            app.UseHttpsRedirection();

            app.UseRouting();

            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });

            app.UseOcelot().Wait();


            app.UseAuthentication();
        }

Мой оцелот. json Файл для аутентифицированного ресурса выглядит следующим образом (имена изменены в целях безопасности):

{
      "DownstreamPathTemplate": "/api/Controller/Get",
      "DownstreamScheme": "http",
      "DownstreamHostAndPorts": [
        {
          "Host": "localhost",
          "Port": 5003
        }
      ],
      "UpstreamPathTemplate": "/authResource/get",
      "UpstreamHttpMethod": [ "GET" ],

      "AuthenticationOptions": {
        "AuthenticationProviderKey": "AzureADJwtBearer",
        "AllowedScopes": []
      }
    }

Чтобы понять, как я это понимаю, я go приведу пример с использованием примера API, показанного в конфигурации ocelot.

I w * sh для доступа к ресурсу http://localhost: 5003 / api / Controller / Get , который является защищенным API, что означает, что я могу получить ответ от этого, только если я предоставлю заголовок авторизации с моим запросом get. Я делаю запрос через мой шлюз ocelot для URL http://localhost: 5000 / authResource / get (я размещаю Ocelot на localhost: 5000). Ocelot считает, что для доступа к этому ресурсу требуется аутентификация, поэтому он делает запрос, используя схему AzureADJwtBearer. Я перенаправлен в Microsoft для входа в систему. После этого я возвращаюсь в приложение Ocelot с токеном доступа на буксире. Ocelot принимает это, создает заголовок Auth и, наконец, вызывает http://localhost: 5003 / api / Controller / Get и возвращает результат.

...