ส่วนหัวคำขอไม่ได้ส่งต่อไปยัง IdentityServer4


9

ฉันใช้ ocelot เป็นเกตเวย์ API สำหรับ microservices ของฉันด้วย IdentityServer4 สำหรับการตรวจสอบสิทธิ์ ในไฟล์กำหนดค่า ocelot ฉันเพิ่ม "AuthenticationOptions" และตั้งค่าคีย์ api ในการเริ่มต้นฉันเพิ่มเซิร์ฟเวอร์ข้อมูลประจำตัว ในเซิร์ฟเวอร์ตัวฉันใช้ค่าจากส่วนหัวเพื่อสร้างสตริงการเชื่อมต่อแบบไดนามิก เมื่อฉันส่งคำขอเพื่อรับโทเค็นส่วนหัวสามารถเข้าถึงได้ในบริการข้อมูลประจำตัว แต่เมื่อฉันส่งคำขอถัดไปด้วยโทเค็นส่วนหัวดั้งเดิมจะไม่สามารถใช้ได้ เฉพาะส่วนหัว "โฮสต์" เท่านั้นที่สามารถเห็นได้ในบริการข้อมูลประจำตัว

มีวิธีในการรักษาส่วนหัวดั้งเดิมในขณะที่กำหนดเส้นทางคำขอไปยังเซิร์ฟเวอร์ข้อมูลประจำตัวหรือไม่

Startup.cs (เพิ่มเซิร์ฟเวอร์ข้อมูลประจำตัว)

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 Authentication และ API ของ ฉันคิดว่าปัญหาอาจเกิดขึ้นเมื่อมีการสร้างคำขออนุญาตให้ใช้รหัสประจำตัว API พยายามตรวจสอบโทเค็นในพอร์ตเดียวกันที่มี API อยู่ดังนั้นคุณสามารถให้ทั้งพอร์ตเดียวกันและลองใช้ได้
Nauman Khan

คุณสามารถโพสต์รหัสที่แสดงว่าคุณพยายามเข้าถึงส่วนหัวเพื่อสร้างสตริงการเชื่อมต่อของคุณได้หรือไม่ นอกจากนี้คุณพยายามอ่านหัวข้ออะไร หากเป็นส่วนหัวของโฮสต์คุณจะมีปัญหา
ห้าม

คำตอบ:


0

ฉันไม่คุ้นเคยกับ Ocelot แต่ในสถาปัตยกรรมของฉันฉันมี IdentityServer ทำงานอยู่หลัง Load Balancer และกำหนดเส้นทางในคลัสเตอร์ Kubernetes ผ่าน Nginx Ingress และสิ่งนี้ทำให้ฉันต้องกำหนดค่าการส่งต่อส่วนหัวใน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.