经过到处搜索后,我能够将一堆迟钝的参考资料放在一起并提出解决方案。
Kestrel 将处于 HTTP 模式,但会通过反向代理的 ForwardedHeaders 被告知它处于 HTTPS 模式。对于 Azure,您必须使用一个特定的集合。其他人将需要其他选项,并且可能需要额外的设置。本文档将在一般情况下为您提供帮助,但不包含 Azure 所需的内容:ASPNet Core 反向代理和负载均衡器配置 https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1
如果您使用的是 IIS,它可以正常工作,因为它是内置的,或者您已在过去版本的 Core 中添加了 UseIIS。
对于容器或基础 Linux 上的 Azure Web 服务,您需要添加以下 Nuget 包:
Microsoft.AspNetCore.HttpOverrides
一旦将其添加到 Startup.cs 中的配置中,您首先需要添加以下内容:
var forwardOptions = new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
RequireHeaderSymmetry = false
};
forwardOptions.KnownNetworks.Clear();
forwardOptions.KnownProxies.Clear();
app.UseForwardedHeaders(forwardOptions);
请注意,如果没有 KnownNetworks 和 KnownProxies Clear(),它将无法工作。如果没有 RequireHeaderSymmetry = false 它将无法工作,因此您需要所有这些。
在 ForwardedHeaders 上,您需要尝试避免使用 .All 或列出的其他选项,因为它存在安全漏洞。
然后在应用程序设置中您需要添加WEBSITES_PORT=80
, ASPNETCORE_URLS=http://+:80
and ASPNETCORE_HTTPS_PORT=443
。在所有这些都完成之前,您将继续收到略有不同的错误。
注意:这不会修复 Swagger 的验证器。由于验证器错误,它还有其他问题。 json 仍然有效,但域不同,所以很奇怪。解决这个问题的简单方法是在 UseSwaggerUi set options.EnableValidator(null); 中设置 options.EnableValidator(null);
app.UseSwaggerUI(
options =>
{
options.EnableValidator(null);
});