O cabeçalho da solicitação não está encaminhando para o IdentityServer4


9

Estou usando o jaguatirica como gateway de API para meus microsserviços com o IdentityServer4 para autenticação. No arquivo de configuração do ocelot, adicionei "AuthenticationOptions" e configurei a chave api. Na inicialização , adiciono o servidor de identidade. No servidor de identidade, uso o valor do cabeçalho para criar dinamicamente a cadeia de conexão. Quando envio a solicitação para obter o token, os cabeçalhos estão acessíveis no serviço de identidade. Mas quando eu enviar a próxima solicitação com o token, os cabeçalhos originais não estarão disponíveis. Somente o cabeçalho "Host" pode estar visível no serviço de identidade.

Existe uma maneira de manter o cabeçalho original ao rotear a solicitação para o servidor de identidade?

Startup.cs (Adicionar servidor de identidade)

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

11
Antes de aprofundar, você pode explicar por que está usando portas diferentes para autenticação e APIs do Identity Server. Eu acho que o problema pode estar lá, quando a solicitação de API é gerada, a autorização de identidade tenta validar o token na mesma porta em que estão as APIs, então você pode fornecer a mesma porta e experimentá-la.
Nauman Khan

Você pode publicar algum código que mostre como você está tentando acessar os cabeçalhos para criar sua cadeia de conexão? Além disso, qual cabeçalho você está tentando ler? Se for o cabeçalho do host, você terá problemas.
Nix

Respostas:


0

Não estou familiarizado com o Ocelot, mas em minha arquitetura eu tenho o IdentityServer executando atrás de um Load Balancer e roteado em um cluster Kubernetes por meio de um Nginx Ingress e isso exigiu que eu configurasse o encaminhamento de cabeçalho no Startup.Configuremétodo do meu IdentityServer da seguinte maneira:

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.