El encabezado de la solicitud no se reenvía a IdentityServer4


9

Estoy usando ocelot como puerta de enlace API para mis microservicios con IdentityServer4 para la autenticación. En el archivo de configuración de ocelot agregué "AuthenticationOptions" y configuré la clave api. En el inicio , agrego el servidor Identity. En el servidor de identidad, uso el valor del encabezado para generar dinámicamente la cadena de conexión. Cuando envío la solicitud para obtener el token, se puede acceder a los encabezados en el servicio de identidad. Pero cuando envío la próxima solicitud con el token, los encabezados originales no están disponibles. Solo el encabezado "Host" puede ser visible en el servicio de identidad.

¿Hay alguna manera de mantener el encabezado original mientras enruta la solicitud al servidor de identidad?

Startup.cs (Agregar servidor de identidad)

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
Antes de profundizar, ¿puede explicar por qué está utilizando diferentes puertos para la autenticación del servidor de identidad y las API? Creo que el problema podría estar allí, ya que cuando se genera una solicitud de API, la autorización de identidad intenta validar el token en el mismo puerto donde están las API, por lo que puede dar el mismo puerto e intentarlo.
Nauman Khan el

¿Puedes publicar algún código que muestre cómo estás intentando acceder a los encabezados para construir tu cadena de conexión? Además, ¿qué encabezado estás tratando de leer? Si es el encabezado del host, tendrá problemas.
Nix

Respuestas:


0

No estoy familiarizado con Ocelot, pero en mi arquitectura tengo IdentityServer ejecutándose detrás de Load Balancer y enrutado en un clúster de Kubernetes a través de un Nginx Ingress y esto me obligó a configurar el reenvío de encabezado en el Startup.Configuremétodo de IdentityServer de esta manera:

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.