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

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

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

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": []
  }
}]

person Chamal Pradeep Rajapakse    schedule 30.09.2019    source источник
comment
Прежде чем углубляться в это, вы можете объяснить, почему вы используете разные порты для аутентификации сервера идентификации и API?. Я думаю, что проблема может быть в том, что когда создается запрос API, авторизация идентификации пытается проверить токен на том же порту, где находятся API, поэтому вы можете указать тот же порт и попробовать его.   -  person Nauman Khan    schedule 03.10.2019
comment
Можете ли вы опубликовать код, который показывает, как вы пытаетесь получить доступ к заголовкам для создания строки подключения? Кроме того, какой заголовок вы пытаетесь прочитать? Если это заголовок хоста, у вас будут проблемы.   -  person Nix    schedule 10.10.2019


Ответы (1)


Я не знаком с 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);
person Nick Cromwell    schedule 07.01.2020