Заголовок запроса не пересылается на IdentityServer4

9

Я использую ocelot в качестве шлюза API для своих микросервисов с IdentityServer4 для аутентификации. В конфигурационном файле ocelot я добавил «AuthenticationOptions» и установил ключ API. В автозагрузке я добавляю сервер идентификации. На сервере идентификации я использую значение из заголовка для динамического построения строки подключения. Когда я отправляю запрос на получение токена, заголовки становятся доступны в сервисе идентификации. Но при отправке следующего запроса с токеном оригинальные заголовки недоступны. Только заголовок «Хост» может быть виден в службе идентификации.

Есть ли способ сохранить оригинальный заголовок при маршрутизации запроса на сервер идентификации?

Startup.cs (Добавить идентификационный сервер)

services
    .AddAuthentication()
    .AddIdentityServerAuthentication("APIParts", options =>
    {
        options.Authority = "http://localhost:60168";
        options.RequireHttpsMetadata = false;
        options.ApiName = "Parts";
        options.SupportedTokens = SupportedTokens.Both;
    });

ocelot.json

ReRoutes": [
{
  "DownstreamPathTemplate": "/connect/token",
  "DownstreamScheme": "http",
  "DownstreamHostAndPorts": [
    {
      "Host": "localhost",
      "Port": 60168
    }
  ],
  "UpstreamPathTemplate": "/token",
  "UpstreamHttpMethod": [ "Post" ]
},
{
  "DownstreamPathTemplate": "/api/Parts/Inventory",
  "DownstreamScheme": "http",
  "DownstreamHostAndPorts": [
    {
      "Host": "localhost",
      "Port": 65241
    }
  ],
  "UpstreamPathTemplate": "/api/Parts/Inventory",
  "AuthenticationOptions": {
    "AuthenticationProviderKey": "APIParts",
    "AllowedScopes": []
  }
}]
Чамал Прадип Раджапаксе
источник
1
Прежде чем углубляться в это, вы можете объяснить, почему вы используете разные порты для аутентификации Identity Server и API? Я думаю, что проблема может быть в том, что когда генерируется запрос API, авторизация идентификации пытается проверить токен на том же порту, где находятся API, так что вы можете указать оба порта и попробовать его.
Науман Хан
Можете ли вы опубликовать некоторый код, который показывает, как вы пытаетесь получить доступ к заголовкам для построения строки подключения? Кроме того, какой заголовок вы пытаетесь прочитать? Если это заголовок хоста, у вас будут проблемы.
Nix

Ответы:

0

Я не знаком с Ocelot, но в моей архитектуре IdentityServer работает за балансировщиком нагрузки и маршрутизируется в кластере Kubernetes через Nginx Ingress, и это потребовало от меня настройки пересылки заголовков в Startup.Configureметоде IdentityServer следующим образом:

var forwardOptions = new ForwardedHeadersOptions
{
    ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
    RequireHeaderSymmetry = false
};

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Ник Кромвель
источник