DiscoveryClient.GetAsync 调用通过 SSL 终结器时失败“颁发者名称与权限不匹配”

DiscoveryClient.GetAsync fails “Issuer name does not match authority” when call passes through SSL-terminator

我们的 Web 应用程序托管在一个 SSL 终止集群后面。我叫DiscoveryClient.GetAsync

var discoveryClient = DiscoveryClient.GetAsync("https://ourcluster.net/identityserver").Result;

我得到以下结果:

Issuer name does not match authority: http://ourcluster.net/identityserver

我假设 SSL 终止导致 IdentityServer 端点以 http 形式接收请求,因此它相应地解析了它的权限 url。

关于如何解决这个问题有什么建议吗?

-S

我们通过在托管 IdentityServer 端点的应用程序中设置 IssuerUri 找到了一个可接受的解决方法:

services.AddIdentityServer(options =>
{
    var issuerUri = Configuration["IdentityServer:IssuerUri"];
    if (!string.IsNullOrEmpty(issuerUri))
    {
        options.IssuerUri = issuerUri;
    }
});

因此,客户端应用程序从 JWT 和它们自己对 IdentityServer 端点的调用中获得相同的 issuerUri 值。

-S

出现这种情况是因为http请求来自处于ssl终止状态的反向代理。因此请求在代理上以 https 的形式发送,然后以 http 的形式发送到 IdentityServer4。

首先,如@leastprivilege 所说,在 IdentityServer 中你必须使用 MS headers 中间件。您可以使用 "Microsoft.AspNetCore.HttpOverrides" 包中的此代码段。

using Microsoft.AspNetCore.HttpOverrides;
....
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    ...
    // UseForwardedHeaders must be BEFORE the UseIdentityServer.
    app.UseForwardedHeaders(new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedProto
    });
    app.UseIdentityServer();
}

然后配置您的反向代理以将 X-Forwarded-Proto 发送到上游。我们使用nginx,所以最低配置必须是:

server {
    listen 80;
    listen [::]:80;
    listen 443 default_server ssl;

    root /var/www;

    server_name id.example.com;

    ssl on;
    ssl_certificate    /opt/certs/2017/identity-server/fullchain.pem;
    ssl_certificate_key   /opt/certs/2017/identity-server/privkey.pem;

    access_log /var/log/nginx/id.example.com-access.log main;
    error_log  /var/log/nginx/id.example.com-error.log;

    location / {
            proxy_pass http://identity-service;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header        X-Forwarded-Proto $scheme;
            proxy_set_header Host $host;
            proxy_redirect off;
    }
}