【问题标题】:Dotnet core identityserver4 reverse proxydotnet core identityserver4 反向代理
【发布时间】:2021-05-17 06:55:56
【问题描述】:

大家好,我的 dotnet 核心应用程序的反向代理配置有问题。我的问题是,当我使用身份服务器发现端点时,我的 url 末尾缺少端口号。

我有一份关于发现文件的请求 https://:8421/.well-known/openid-configuration 并且响应如下,这里的问题是身份验证服务的客户端使用文档作为验证的基础,使用响应中的 jwks_uri 属性,该属性中列出的 url 缺少端口号,所以客户端无法调用openId配置。

 {
    "issuer": "https://<servername>",
    "jwks_uri": "https://<servername>/.well-known/openid-configuration/jwks",
    "authorization_endpoint": "https://<servername>/connect/authorize",
    "token_endpoint": "https://<servername>/connect/token",
    "userinfo_endpoint": "https://<servername>/connect/userinfo",
    "end_session_endpoint": "https://<servername>/connect/endsession",
    "check_session_iframe": "https://<servername>/connect/checksession",
    "revocation_endpoint": "https://<servername>/connect/revocation",
    "introspection_endpoint": "https://<servername>/connect/introspect",
    "device_authorization_endpoint": "https://<servername>/connect/deviceauthorization"
}

端点配置的预期结果:

  {
    "jwks_uri": "https://<servername>:<port>/.well-known/openid-configuration/jwks",
  }

在我的 dotnet 应用程序中,我设置了反向代理设置

  services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders =
                         ForwardedHeaders.XForwardedFor |
                         ForwardedHeaders.XForwardedHost |
                         ForwardedHeaders.XForwardedProto;

            options.ForwardLimit = 2;  //Limit number of proxy hops trusted
            options.KnownNetworks.Clear();
            options.KnownProxies.Clear();
        });
  app.UseForwardedHeaders();

nginx 配置如下

server {
    listen <ip>:8421 ssl;
    server_name _; 

    ssl_certificate    <certPath> ;
    ssl_certificate_key <certPath>;
 

    location / {
        proxy_pass http://127.0.0.1:8421; 

        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Host $remote_addr;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Port 8421;
    }
}

在更新到 Identityserver 4 4.0 之前,它具有 Public origin 属性,但在 4.0 中已弃用。现在改为使用 dotnet baseurl。

在 http 管道中,我还记录了请求中的所有标头并得到了以下结果:

2020-07-03 11:40:15.109 +00:00;[INF];Cache-Control--no-cache Connection--upgrade Accept--*/* Accept-Encoding--gzip, deflate, br Host--<hostName> User-Agent--PostmanRuntime/7.26.1 X-Real-IP--<ip> X-Original-Proto--http X-Forwarded-Host--<domainName with port> X-Forwarded-Port--8421 Postman-Token--44dc6573-71eb-4b36-8b2a-9768d71e5b64 X-Original-For--<ip address> ;;

【问题讨论】:

  • 您是否考虑过使用 NGINX 而不是滚动您自己的反向代理应用程序?也许矫枉过正,但也许比自己动手更好。
  • 这是 nginx 代理背后的应用。我在问是否有可能配置 nginx 与身份服务器一起工作
  • 非常感谢您的澄清

标签: nginx .net-core identityserver4 nginx-reverse-proxy


【解决方案1】:

我还必须将端口添加到 nginx 配置中。将 X-Forwarded-Host 设置为 $host 还不够,还必须添加 $proxy_port

代理的工作配置

proxy_set_header X-Forwarded-Host $host:$proxy_port;

【讨论】:

    【解决方案2】:

    如果主机正在侦听非默认端口(http 不是 80,https 不是 443),请使用 $http_host 而不是 $host 来设置 主机如下图。
    更改
    change proxy_set_header Host $host;

    proxy_set_header Host $http_host;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 2019-05-20
      • 2017-02-18
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2018-08-26
      相关资源
      最近更新 更多