Header permintaan tidak meneruskan ke IdentityServer4

9

Saya menggunakan ocelot sebagai gateway API untuk layanan microser saya dengan IdentityServer4 untuk otentikasi. Dalam file konfigurasi ocelot saya menambahkan "AuthenticationOptions" dan mengatur kunci api. Di Startup saya menambahkan server Identity. Di server identitas saya menggunakan nilai dari header untuk secara dinamis membangun string koneksi. Ketika saya mengirim permintaan untuk mendapatkan token, tajuk dapat diakses di layanan identitas. Tetapi ketika saya mengirim permintaan berikutnya dengan tajuk asli token tidak tersedia. Hanya tajuk "Host" yang dapat dilihat di layanan identitas.

Apakah ada cara untuk menjaga tajuk asli saat merutekan permintaan ke server identitas?

Startup.cs (Tambah server identitas)

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
sumber
1
Sebelum membahas lebih dalam, bisakah Anda menjelaskan mengapa Anda menggunakan port yang berbeda untuk Identity Server Authentication dan API's? Saya pikir masalah mungkin ada di sana ketika permintaan API dihasilkan otorisasi identitas mencoba untuk memvalidasi token pada port yang sama di mana API berada, jadi dapatkah Anda memberikan port yang sama dan mencobanya.
Nauman Khan
Bisakah Anda memposting beberapa kode yang menunjukkan bagaimana Anda mencoba mengakses header untuk membangun string koneksi Anda? Selain itu tajuk apa yang ingin Anda baca? Jika header host Anda akan memiliki masalah.
Nix

Jawaban:

0

Saya tidak terbiasa dengan Ocelot, tetapi dalam arsitektur saya, saya memiliki IdentityServer berjalan di belakang Load Balancer dan dialihkan dalam cluster Kubernetes melalui Nginx Ingress dan ini mengharuskan saya untuk mengkonfigurasi penerusan header dalam Startup.Configuremetode IdentityServer saya seperti:

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

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