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