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

时间:2019-12-02 15:30:45

标签: identityserver4

我收到“发行人名称与授权不匹配”错误,因为我的is4服务前有一个ssl终止负载均衡器(即发行人为https://myurl,授权为http://myurl)。

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

4 个答案:

答案 0 :(得分:1)

您的颁发者和授权机构可能会有所不同,但需要更改服务器的配置和发现请求。

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

var tabCounter = 0;
var tabTitle = $( "#tab_title" )
var tabTemplate = "<li><a href='#{href}'>#{label}</a> <span class='ui-icon ui-icon-close' role='presentation'>Remove Tab</span></li>"
var tabs = $("#tabs").tabs();

$(function() {
  $("#saveTable").click(function(){
    addTab();
  });
});

function addTab() {
  tabCounter++;
  var label = tabTitle.val() || "Tab" + tabCounter,
    id = "tabs-" + tabCounter,
    li = $( tabTemplate.replace( /#\{href\}/g, "#" + id ).replace( /#\{label\}/g, label ) ),
    tabTableHtml = "<table id=\"resultTable-" + tabCounter + "\"></table>"

  tabs.find( ".ui-tabs-nav" ).append( li );
  tabs.append( "<div id='" + id + "'>" + tabTableHtml + "</div>" );
  tabs.tabs( "refresh" );
}

然后在您的发现文档请求中:

var identityServerBuilder = services.AddIdentityServer(options =>
{
    if (Environment.IsDevelopment())
    {
        options.IssuerUri = $"http://myurl:5000";
    }
    else
    {
        options.IssuerUri = $"https://myurl";
    }
})

答案 1 :(得分:0)

您的发行者URL为https,但是授权URL为http。这两个网址应该完全相同。

否则,您可以尝试将ValidateIssuerName属性设置为false。此属性决定issuer的名称是否必须与authority相同。默认情况下为true-

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

答案 2 :(得分:0)

identityserver4 gitter上来自mackie1001的答案

您的负载均衡器应按原始协议(X-Forwarded-Proto)转发,您可以使用它来设置当前请求方案以匹配传入请求 您只需要创建一个中间件功能即可 阅读以下内容:https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.0

作为参考,这是我添加到启动中的代码:-

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

非常感谢mackie1001!

答案 3 :(得分:0)

如果使用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();
            });

然后在身份服务器中间件之前添加此中间件

app.UseForwardedHeaders();