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": []
}
}]
la source
Réponses:
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.Configure
méthode de mon IdentityServer comme ceci:la source