为 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 的 IssuerUri
和 Discovery Endpoints
使用 SSL 绑定。但是,当我将其托管在 ASP.NET 核心模块后面时,它会将其托管在 http://localhost:{random port}
上,这又会为非 https 的 Identityserver 生成 IssuerUri
和 Endpoints
。
我尝试了以下但没有成功:
确保我在 IIS 网站上拥有适用于
https 绑定并删除了端口 80
上的绑定
尝试更改 web.config 中的环境变量 ASPNETCORE_URLS
指向 https 地址。
已尝试重写和重定向 web.config 中的规则。
在 IISOptions
上查找设置(由 .UseIISIntegration()
使用)
在我的启动中 class 绑定到特定的 url 或更改协议。
试图找到类似的设置,例如 RequireSSL
(IdentityServer 3) 或
RequireHttpsMetadata
在 IdentityServer4 中。
在启动时更改了 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
我遇到的问题是当我尝试在使用 SSL 的 IIS 服务器上托管 IdentityServer4 的实现时。 (完全 SSL 严格)
当 运行 我的应用程序单独在 Kestrel 上激活 SSL 时它工作正常并且 IdentityServer 的 IssuerUri
和 Discovery Endpoints
使用 SSL 绑定。但是,当我将其托管在 ASP.NET 核心模块后面时,它会将其托管在 http://localhost:{random port}
上,这又会为非 https 的 Identityserver 生成 IssuerUri
和 Endpoints
。
我尝试了以下但没有成功:
确保我在 IIS 网站上拥有适用于 https 绑定并删除了端口 80
上的绑定
尝试更改 web.config 中的环境变量
ASPNETCORE_URLS
指向 https 地址。已尝试重写和重定向 web.config 中的规则。
在
IISOptions
上查找设置(由.UseIISIntegration()
使用) 在我的启动中 class 绑定到特定的 url 或更改协议。试图找到类似的设置,例如
RequireSSL
(IdentityServer 3) 或RequireHttpsMetadata
在 IdentityServer4 中。在启动时更改了 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