如何使ASP.net核心在与Azure应用容器服务一起使用的SSL上的docker中运行?
我让它在HTTP上运行,但是一旦我尝试将其绑定到SSL,以便ASP.NET对oauth甚至swagger之类的验证都可以正常工作,它会告诉我“无法配置HTTPS终结点。已指定服务器证书,并且找不到默认的开发人员证书。” vs.net生成的仅运行时映像无法运行运行证书,即使那样,它似乎也不安全,可能是由于浏览器中的证书错误所致。
基本上,我需要https始终从外部端点开始工作,以便红k进行加密等操作,而不是ngix或默认情况下在外部代理上运行的操作。
这在vs.net调试中效果很好,因为它不会遇到任何错误,即使绑定到https也能正常工作。
遗憾的是,该文档仅处理最基本的用例,并未概述如何使真实的https网站与aspnet核心和Azure应用容器可靠地协同工作。
答案 0 :(得分:6)
在到处搜索之后,我能够整理一堆钝角引用并提出解决方案。
Kestrel将处于HTTP模式,但是将通过反向代理的ForwardedHeaders告知其处于HTTPS模式。对于Azure,必须使用一组特定的设置。其他人将需要其他选项,并且可能需要其他设置。本文档将在一般情况下为您提供帮助,但没有Azure所需的条件:ASPNet Core Reverse Proxy and Load Balancer Configuration
如果您使用的是IIS,它就可以工作,因为它是内置的,或者您在Core的过去版本中添加了UseIIS。
对于基于容器或基于Linux的Azure Web Services,您需要添加以下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
和ASPNETCORE_HTTPS_PORT=443
。直到所有这些都存在,您才会继续遇到稍微不同的错误。
注意:这不会修复Swagger的验证器。还有其他问题,因为验证器错误。 json仍然有效,但域不同,因此很奇怪。解决这个问题的简单方法是在UseSwaggerUi设置options.EnableValidator(null);
app.UseSwaggerUI(
options =>
{
options.EnableValidator(null);
});