为 IdentityServer 4 配置 ASP.NET 核心模块以在 https 而不是 http 上托管

Configure ASP.NET Core Module to host on https instead of http for IdentityServer 4

我遇到的问题是当我尝试在使用 SSL 的 IIS 服务器上托管 IdentityServer4 的实现时。 (完全 SSL 严格)

当 运行 我的应用程序单独在 Kestrel 上激活 SSL 时它工作正常并且 IdentityServer 的 IssuerUriDiscovery Endpoints 使用 SSL 绑定。但是,当我将其托管在 ASP.NET 核心模块后面时,它会将其托管在 http://localhost:{random port} 上,这又会为非 https 的 Identityserver 生成 IssuerUriEndpoints

我尝试了以下但没有成功:

  1. 确保我在 IIS 网站上拥有适用于 https 绑定并删除了端口 80

  2. 上的绑定
  3. 尝试更改 web.config 中的环境变量 ASPNETCORE_URLS 指向 https 地址。

  4. 已尝试重写和重定向 web.config 中的规则。

  5. IISOptions 上查找设置(由 .UseIISIntegration() 使用) 在我的启动中 class 绑定到特定的 url 或更改协议。

  6. 试图找到类似的设置,例如 RequireSSL (IdentityServer 3) 或 RequireHttpsMetadata 在 IdentityServer4 中。

  7. 在启动时更改了 IdentityServer 选项中的 IssuerUri class 希望它也可以更新其他端点。

我可能错过了一些非常明显的东西,但现在我不知道那可能是什么。

非常感谢来自社区的任何帮助:-)

Program.cs code

    public static void Main(string[] args)
    {
        Console.Title = "IdentityServer";

        var config = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("kestrelHosting.json", optional: true)
            .AddCommandLine(args)
            .Build();

        var host = new WebHostBuilder()
            .UseConfiguration(config)
            .UseKestrel(options =>
            {
                // options.ThreadCount = 4;
                options.NoDelay = true;
                options.UseHttps("VismaCert.pfx", "Visma123");
                //options.UseConnectionLogging();
            })
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .Build();

        host.Run();
    }

AspNetCoreModule 是一个 SSL 终结器,它不会通过 HTTPS 与 Kestrel 通信。它所做的是通过 header 转发原始方案,以便您可以在生成 urls/links 时使用它。默认情况下,UseIISIntegration 包含一个 ForwardedHeaders 中间件,它将获取这些 headers 并将它们应用于请求字段。但是,有些情况下 header 无法通过默认设置进行处理。这里有一堆参考资料:https://github.com/aspnet/Docs/issues/2384