IdentityServer4发现客户端错误-颁发者名称与授权不匹配

IdentityServer4发现客户端错误-颁发者名称与授权不匹配,identityserver4,Identityserver4,我收到“颁发者名称与授权不匹配”错误,因为我的is4服务前面有一个ssl终止负载平衡器(即,颁发者是,授权是) 在这种情况下我该怎么办?dns名称相同,是https中的s导致验证失败 您的发卡机构url是https,而机构url是http。两个URL应该完全相同 否则,您可以尝试将validateisuername属性设置为false。此属性决定颁发者名称是否必须与颁发机构相同。默认情况下,这是真的- var discoRequest = new DiscoveryDoc

我收到“颁发者名称与授权不匹配”错误,因为我的is4服务前面有一个ssl终止负载平衡器(即,颁发者是,授权是)


在这种情况下我该怎么办?dns名称相同,是https中的s导致验证失败

您的发卡机构url是
https
,而机构url是
http
。两个URL应该完全相同

否则,您可以尝试将
validateisuername
属性设置为false。此属性决定
颁发者
名称是否必须与
颁发机构
相同。默认情况下,这是真的-

            var discoRequest = new DiscoveryDocumentRequest
            {
                Address = "authority",
                Policy = new DiscoveryPolicy
                {
                    ValidateIssuerName = false,
                },
            };

您的发卡机构url为
https
,但授权机构url为
http
。两个URL应该完全相同

否则,您可以尝试将
validateisuername
属性设置为false。此属性决定
颁发者
名称是否必须与
颁发机构
相同。默认情况下,这是真的-

            var discoRequest = new DiscoveryDocumentRequest
            {
                Address = "authority",
                Policy = new DiscoveryPolicy
                {
                    ValidateIssuerName = false,
                },
            };

您的颁发者和权限可能不同,但需要更改服务器的配置和发现请求

在Identity Server的启动方法中,可以设置颁发者:

var identityServerBuilder = services.AddIdentityServer(options =>
{
    if (Environment.IsDevelopment())
    {
        options.IssuerUri = $"http://myurl:5000";
    }
    else
    {
        options.IssuerUri = $"https://myurl";
    }
})
然后在您的发现文档请求中:

DiscoveryDocumentRequest discoveryDocument = null;
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == EnvironmentName.Development)
    {
        discoveryDocument = new DiscoveryDocumentRequest()
        {
            Address = "http://myurl:5000",
            Policy = {
                 RequireHttps = false,
                 Authority = "http://myurl:5000",
                 ValidateEndpoints = false
            },
         };
    }
    else
    {
         discoveryDocument = new DiscoveryDocumentRequest()
         {
             Address = "http://myurl:5000",
             Policy = {
                  RequireHttps = false,
                  Authority = "https://myurl",
                  ValidateEndpoints = false
             },
         };
}
var disco = await httpClient.GetDiscoveryDocumentAsync(discoveryDocument);

您的颁发者和权限可能不同,但需要更改服务器的配置和发现请求

在Identity Server的启动方法中,可以设置颁发者:

var identityServerBuilder = services.AddIdentityServer(options =>
{
    if (Environment.IsDevelopment())
    {
        options.IssuerUri = $"http://myurl:5000";
    }
    else
    {
        options.IssuerUri = $"https://myurl";
    }
})
然后在您的发现文档请求中:

DiscoveryDocumentRequest discoveryDocument = null;
if (Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") == EnvironmentName.Development)
    {
        discoveryDocument = new DiscoveryDocumentRequest()
        {
            Address = "http://myurl:5000",
            Policy = {
                 RequireHttps = false,
                 Authority = "http://myurl:5000",
                 ValidateEndpoints = false
            },
         };
    }
    else
    {
         discoveryDocument = new DiscoveryDocumentRequest()
         {
             Address = "http://myurl:5000",
             Policy = {
                  RequireHttps = false,
                  Authority = "https://myurl",
                  ValidateEndpoints = false
             },
         };
}
var disco = await httpClient.GetDiscoveryDocumentAsync(discoveryDocument);

mackie1001关于identityserver4 gitter的回答

您的负载平衡器应该在原始协议(X-Forwarded-Proto)上转发,您可以使用该协议设置当前请求方案以匹配传入请求 您只需要创建一个中间件函数就可以做到这一点 读一读:

以下是我添加到startup中的代码供参考:-

                app.UseForwardedHeaders(new ForwardedHeadersOptions
                {
                  ForwardedHeaders = ForwardedHeaders.XForwardedProto
                });

非常感谢mackie1001

来自mackie1001关于identityserver4 gitter的回答

您的负载平衡器应该在原始协议(X-Forwarded-Proto)上转发,您可以使用该协议设置当前请求方案以匹配传入请求 您只需要创建一个中间件函数就可以做到这一点 读一读:

以下是我添加到startup中的代码供参考:-

                app.UseForwardedHeaders(new ForwardedHeadersOptions
                {
                  ForwardedHeaders = ForwardedHeaders.XForwardedProto
                });

非常感谢mackie1001

如果使用nginx作为负载平衡器,您可能需要在服务配置中使用它

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

                // Only loopback proxies are allowed by default.
                // Clear that restriction because forwarders are enabled by explicit
                // configuration.
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

如果使用nginx作为负载平衡器,您可能需要在服务配置中使用它

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

                // Only loopback proxies are allowed by default.
                // Clear that restriction because forwarders are enabled by explicit
                // configuration.
                options.KnownNetworks.Clear();
                options.KnownProxies.Clear();
            });

您好,Aparna,授权必须保持https,因为这是客户端连接到is4服务器的方式,即通过ssl连接到负载平衡器。如何使发卡机构也使用https?据我所知,这是由is4生成的,但我不知道它是如何决定是使用http还是https。不幸的是,我添加了validateisuername=false,这让我遇到了下一个错误,这与无效端点有关。然后我添加了ValidateEndpoint=false,但随后我得到了一个无效的_请求错误。我目前正在进行故障排除,以确定这个无效的\u请求错误是什么。有一点是肯定的,如果我只使用http,而不是https,那么完全相同的代码/配置/负载平衡器设置就可以正常工作。我不知道为什么要在url上进行验证,而不仅仅是dns名称,因为dns名称是我想的重要部分,而不是它是http还是https。我找到了PublicOrigin属性,但这只(讽刺地!)有助于设置dns名称,它不控制http/s部分。我认为在discovery client中禁用验证是最实用的方法,我今天遇到了一个问题,就是这个无效的_请求错误:(您好,Aparna,管理局必须保留https,因为这是客户端连接到is4服务器的方式,即通过ssl连接到负载平衡器。我如何使颁发者也使用https?据我所知,这是由is4生成的,但我不知道它如何决定是放置http还是https。不幸的是,我添加了validateisuername=false,这才让我明白下一个错误与无效端点有关。然后我添加了ValidateEndpoint=false,但随后我得到了一个无效的\u请求错误。我目前正在进行故障排除,以找出这个无效的\u请求错误是什么。有一点是肯定的,如果我只使用http,而不是https,完全相同的代码/config/load balancer设置工作正常。我是我不知道为什么验证是在url上进行的,而不仅仅是dns名称,因为dns名称是我想的重要部分,而不是它是http还是https。我找到了PublicOrigin属性,但这只是(讽刺的是!)有助于设置dns名称,它不控制http/s部分。我认为在发现客户端中禁用验证是最实用的方法,我今天遇到了一个问题,出现了以下无效的\u请求错误:(嗨,nick,看起来很理想!我也在is4 gitter上发布了这个问题,mackie1001回答说需要处理转发的标题,我认为这是一个稍微好一点的解决方案,因为我不需要设置颁发者uri,可以让它像以前一样生成。我将在下面为遇到这个问题的任何人添加他的答案。你好,nick,这看起来很理想!我也在is4 gitter上发布了这个问题,mackie1001回答说需要处理转发的标题,我认为这是一个稍微好一点的解决方案,因为我不需要设置颁发者uri,可以让它像以前一样生成。我将在下面为遇到这个问题的任何人添加他的答案。