요청 헤더가 IdentityServer4로 전달되지 않습니다


9

인증을 위해 IdentityServer4가있는 마이크로 서비스의 API 게이트웨이로 ocelot을 사용하고 있습니다. ocelot 설정 파일에서 "AuthenticationOptions"를 추가하고 API 키를 설정했습니다. 에서 시작 I는 Identity 서버를 추가 할 수 있습니다. Identity Server에서는 헤더의 값을 사용하여 연결 문자열을 동적으로 작성합니다. 토큰을 얻기 위해 요청을 보내면 자격 증명 서비스에서 헤더에 액세스 할 수 있습니다. 그러나 토큰으로 다음 요청을 보내면 원래 헤더를 사용할 수 없습니다. ID 서비스에는 "호스트"헤더 만 표시 될 수 있습니다.

요청을 Identity Server로 라우팅하는 동안 원래 헤더를 유지하는 방법이 있습니까?

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에 익숙하지는 않지만 내 아키텍처에서는 Identity Server가 Load Balancer 뒤에서 실행되고 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.