L'en-tête de demande n'est pas transmis à IdentityServer4

9

J'utilise ocelot comme passerelle API pour mes microservices avec IdentityServer4 pour l'authentification. Dans le fichier de configuration ocelot, j'ai ajouté "AuthenticationOptions" et défini la clé api. Dans le démarrage, j'ajoute le serveur d'identité. Dans le serveur d'identité, j'utilise la valeur de l'en-tête pour créer dynamiquement la chaîne de connexion. Lorsque j'envoie la demande de jeton, les en-têtes sont accessibles dans le service d'identité. Mais lorsque j'envoie la prochaine demande avec le jeton, les en-têtes d'origine ne sont pas disponibles. Seul l'en-tête "Host" peut être visible dans le service d'identité.

Existe-t-il un moyen de conserver l'en-tête d'origine lors du routage de la demande vers le serveur d'identité?

Startup.cs (Ajouter un serveur d'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": []
  }
}]
Chamal Pradeep Rajapakse
la source
1
Avant d'aller plus loin, vous pouvez expliquer pourquoi vous utilisez différents ports pour l'authentification Identity Server et les API?. Je pense que le problème peut être là car lorsque la demande d'API est générée, une autorisation d'identité tente de valider le jeton sur le même port que celui des API, vous pouvez donc donner le même port et l'essayer.
Nauman Khan
Pouvez-vous publier du code qui montre comment vous essayez d'accéder aux en-têtes pour créer votre chaîne de connexion? De plus, quel en-tête essayez-vous de lire? Si c'est l'en-tête de l'hôte, vous allez avoir des problèmes.
Nix

Réponses:

0

Je ne connais pas Ocelot, mais dans mon architecture, j'ai IdentityServer exécuté derrière un équilibreur de charge et routé dans un cluster Kubernetes via une entrée Nginx et cela m'a obligé à configurer le transfert d'en-tête dans la Startup.Configureméthode de mon IdentityServer comme ceci:

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
Nick Cromwell
la source