Контекст: Моя компания переходит на 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 и возвращает результат.