Azure App Service容器上的ASP.net核心docker https

时间:2018-07-02 21:09:17

标签: c# asp.net azure docker azure-web-sites

如何使ASP.net核心在与Azure应用容器服务一起使用的SSL上的docker中运行?

我让它在HTTP上运行,但是一旦我尝试将其绑定到SSL,以便ASP.NET对oauth甚至swagger之类的验证都可以正常工作,它会告诉我“无法配置HTTPS终结点。已指定服务器证书,并且找不到默认的开发人员证书。” vs.net生成的仅运行时映像无法运行运行证书,即使那样,它似乎也不安全,可能是由于浏览器中的证书错误所致。

基本上,我需要https始终从外部端点开始工作,以便红k进行加密等操作,而不是ngix或默认情况下在外部代理上运行的操作。

这在vs.net调试中效果很好,因为它不会遇到任何错误,即使绑定到https也能正常工作。

遗憾的是,该文档仅处理最基本的用例,并未概述如何使真实的https网站与aspnet核心和Azure应用容器可靠地协同工作。

1 个答案:

答案 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=80ASPNETCORE_URLS=http://+:80ASPNETCORE_HTTPS_PORT=443。直到所有这些都存在,您才会继续遇到稍微不同的错误。

注意:这不会修复Swagger的验证器。还有其他问题,因为验证器错误。 json仍然有效,但域不同,因此很奇怪。解决这个问题的简单方法是在UseSwaggerUi设置options.EnableValidator(null);

  app.UseSwaggerUI(
        options =>
        {
            options.EnableValidator(null);                  
        });