リクエストヘッダーがIdentityServer4に転送されない


9

認証にIdentityServer4を使用するマイクロサービスのAPIゲートウェイとしてocelotを使用しています。ocelot設定ファイルに「AuthenticationOptions」を追加して、apiキーを設定しました。ではスタートアップ Iは、Identityサーバーを追加します。IDサーバーでは、ヘッダーの値を使用して、接続文字列を動的に構築します。トークンを取得するリクエストを送信すると、IDサービスでヘッダーにアクセスできます。しかし、トークンを使用して次のリクエストを送信すると、元のヘッダーが使用できません。IDサービスで表示できるのは「Host」ヘッダーのみです。

リクエストをアイデンティティサーバーにルーティングする間、元のヘッダーを保持する方法はありますか?

Startup.cs(IDサーバーの追加)

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
詳細に進む前に、Identity Server認証とAPIに異なるポートを使用している理由を説明できますか?APIリクエストが生成されると、ID承認がAPIがあるのと同じポートでトークンを検証しようとするため、同じポートを指定してそれを試すことができるので、問題があると思います。
Nauman Khan、

ヘッダーにアクセスして接続文字列を作成する方法を示すコードを投稿できますか?さらに、どのヘッダーを読み込もうとしていますか?ホストヘッダーの場合、問題が発生します。
Nix

回答:


0

私はOcelotに詳しくありませんが、私のアーキテクチャでは、IdentityServerをロードバランサーの背後で実行し、Nginx Ingressを介してKubernetesクラスターでルーティングしてStartup.Configureいるため、IdentityServerのメソッドでヘッダー転送を構成する必要がありました。

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

forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.