Anforderungsheader werden nicht an IdentityServer4 weitergeleitet


9

Ich verwende ocelot als API-Gateway für meine Microservices mit IdentityServer4 zur Authentifizierung. In der ocelot-Konfigurationsdatei habe ich "AuthenticationOptions" hinzugefügt und den API-Schlüssel festgelegt. Im Startup füge ich den Identity Server hinzu. Auf dem Identitätsserver verwende ich den Wert aus dem Header, um die Verbindungszeichenfolge dynamisch aufzubauen. Wenn ich die Anforderung zum Abrufen eines Tokens sende, sind Header im Identitätsdienst verfügbar. Aber wenn ich die nächste Anfrage mit dem Token sende, sind die ursprünglichen Header nicht verfügbar. Im Identitätsdienst kann nur der Header "Host" angezeigt werden.

Gibt es eine Möglichkeit, den ursprünglichen Header beizubehalten, während die Anforderung an den Identitätsserver weitergeleitet wird?

Startup.cs (Identitätsserver hinzufügen)

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
Bevor Sie sich damit befassen, können Sie erklären, warum Sie verschiedene Ports für die Identity Server-Authentifizierung und APIs verwenden. Ich denke, das Problem könnte darin bestehen, dass beim Generieren einer API-Anforderung eine Identitätsautorisierung versucht, das Token an demselben Port zu validieren, an dem sich APIs befinden. Sie können also beide denselben Port angeben und es versuchen.
Nauman Khan

Können Sie einen Code veröffentlichen, der zeigt, wie Sie versuchen, auf die Header zuzugreifen, um Ihre Verbindungszeichenfolge zu erstellen? Welchen Header möchten Sie zusätzlich lesen? Wenn es der Host-Header ist, werden Sie Probleme haben.
Nix

Antworten:


0

Ich bin mit Ocelot nicht vertraut, aber in meiner Architektur läuft IdentityServer hinter einem Load Balancer und wird über einen Nginx Ingress in einem Kubernetes-Cluster weitergeleitet. Daher musste ich die Header-Weiterleitung in der Startup.ConfigureMethode meines IdentityServers wie folgt konfigurieren :

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.