Проблема, с которой я столкнулся, заключается в том, что ни один промежуточного программного обеспечения в моих нижестоящих службах подвергаются воздействию после аутентификации запроса через шлюз API. Информация о клиенте остается нулевой, поскольку промежуточное программное обеспечение, ответственное за определение клиента, никогда не вызывается. Однако если я напрямую обращаюсь к нисходящему API (минуя шлюз и аутентификацию), все работает нормально — промежуточное программное обеспечение выполняется, и клиент разрешается правильно.
Вот разбивка настройки :
- API-шлюз: использует Ocelot и настроен с помощью IdentityServer4 для аутентификации.
- Downstream API: реализует мультитенантность с промежуточным программным обеспечением для определения клиента из строки запроса.
- Проблема: когда запрос маршрутизируется через шлюз API и после проверки подлинности промежуточное программное обеспечение в нижестоящей службе (например, разрешение арендатора) не вызывается, в результате чего арендатор остается нулевым. Без аутентификации нисходящий API работает должным образом, и клиент разрешается правильно.
Конфигурация в ocelot.json:
р>
Код: Выделить всё
{
"DownstreamPathTemplate": "/api/{everything}",
"DownstreamScheme": "http",
"DownstreamHostAndPorts": [
{
"Host": "localhost",
"Port": 41582
}
],
"UpstreamPathTemplate": "/example-api/{everything}",
"RateLimitOptions": {
"ClientWhitelist": [],
"EnableRateLimiting": true,
"Period": "1s",
"PeriodTimespan": 1,
"Limit": 100
},
"AuthenticationOptions": {
"AuthenticationProviderKey": "TestKey",
"AllowedScopes": []
},
"Key": "example.api"
}
Код: Выделить всё
app.UseMultiTenant();
app.UseSerilogRequestLogging();
app.UseCustomErrorHandlingMiddleware();
app.UseSwagger();
app.UseSwaggerUI();
app.UseHttpsRedirection();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
Если я подключусь к нисходящему API **напрямую, минуя шлюз API** (т. е. без аутентификации), Конвейер промежуточного программного обеспечения работает нормально, и клиент разрешается правильно.
Что не получается:
Когда запрос аутентифицируется через шлюз API, нижестоящая служба промежуточные программы (например, UseMultiTenant()) никогда не выполняются, оставляя арендатора null.
Что я пробовал< /strong>:
- Проверен порядок промежуточного программного обеспечения, чтобы убедиться, что UseMultiTenant() находится перед UseAuthentication() .
- Включено подробное ведение журнала в Ocelot, но не обнаружено проблем, связанных с пересылкой запросов.
- Проверено, что нисходящий API правильно настроен для проверки токен с помощью AddJwtBearer.
Вопросы:
- Почему промежуточное программное обеспечение нижестоящей службы (например, UseMultiTenant()) не затрагивается после аутентификации через шлюз API?
- Как можно Я гарантирую, что промежуточное программное обеспечение разрешения арендаторов вызывается, когда запрос проходит через шлюз API с аутентификацией?
Подробнее здесь: https://stackoverflow.com/questions/789 ... tenant-set