L'intestazione della richiesta non viene inoltrata a IdentityServer4


9

Sto usando Ocelot come gateway API per i miei microservizi con IdentityServer4 per l'autenticazione. Nel file di configurazione ocelot ho aggiunto "AuthenticationOptions" e impostato la chiave API. In avvio aggiungo il server di identità. Nel server delle identità utilizzo il valore dall'intestazione per creare dinamicamente la stringa di connessione. Quando invio la richiesta per ottenere il token, le intestazioni sono accessibili nel servizio identità. Ma quando invio la prossima richiesta con il token, le intestazioni originali non sono disponibili. Nel servizio identità è visibile solo l'intestazione "Host".

Esiste un modo per mantenere l'intestazione originale durante il routing della richiesta al server di identità?

Startup.cs (Aggiungi server identità)

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
Prima di approfondire, puoi spiegare perché stai utilizzando porte diverse per l'autenticazione di Identity Server e le API? Penso che il problema potrebbe essere lì quando quando viene generata la richiesta API l'autorizzazione dell'identità tenta di convalidare il token sulla stessa porta in cui si trovano le API, quindi puoi dare entrambe le stesse porte e provarlo.
Nauman Khan,

Puoi pubblicare del codice che mostra come stai tentando di accedere alle intestazioni per creare la stringa di connessione? Inoltre quale intestazione stai cercando di leggere? Se si tratta dell'intestazione host avrai dei problemi.
Nix,

Risposte:


0

Non ho familiarità con Ocelot, ma nella mia architettura ho IdentityServer in esecuzione dietro un Load Balancer e instradato in un cluster Kubernetes tramite un Nginx Ingress e questo mi ha richiesto di configurare l'inoltro di intestazione nel Startup.Configuremetodo del mio IdentityServer in questo modo:

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.