首页 > 解决方案 > 部署为 docker 容器的 Azure Web 应用程序无限 301 循环

问题描述

我们正在尝试将我们的 REST Web API 从托管为 Windows .NET Core 3.1 堆叠 Web 应用程序迁移到 Azure 上 Linux 上的容器化 Web 应用程序。

到目前为止,我们已经设法将映像推送到 Azure 容器注册表,在那里它会被自动提取并成功部署到应用服务。不幸的是,该应用程序尚未正常工作。当尝试从我们的API GET https://foo.azurewebsites.net/api/configuration(location: https://foo.azurewebsites.net/api/configuration导致重定向循环。

到目前为止,我不知道为什么我会得到 301,我很高兴有任何提示。

兴趣点:

标签: asp.net-coreazure-web-app-serviceazure-container-registry

解决方案


以下是我解决问题的方法:事实证明,永久重定向循环的原因是代理在 Azure 部署中的工作方式(感谢 Jason Pan 为我指明了那个方向)和我们在我们的Startup

services.AddControllersWithViews()
        .AddMvcOptions(o =>
        {
           ...
           o.Filters.Add(new RequireHttpsAttribute { Permanent = true }); // REMOVE THIS LINE
           ...
        });

删除RequireHttpsAttribute过滤器后,该应用程序开始按预期工作。由于我已将 TLS/SSL 设置配置为仅允许 HTTPS,因此我认为省略过滤器是安全的。

更新 2021-01-20

我刚刚发现有一种更好的方法可以做到这一点,不需要移除RequireHttpsAttribute过滤器。问题的核心是 Kestrel 不知道通信是通过安全通道进行的,因为反向代理正在将请求转发http到 Kestrel。所以我们需要启用标头的转发。对于 .NET Core 2.x 应用程序,这意味着遵循配置 ASP.NET Core 以使用代理服务器和负载平衡器中说明的步骤。幸运的是,对于 ASP.NET Core 3.x 应用程序,有一种更简单的方法(不幸的是,官方文档中尚未提及,但它是预览版 6公告的一部分):只需设置ASPNETCORE_FORWARDEDHEADERS_ENABLED环境变量为true. 这可以在 Azure 门户中的配置 > 应用程序设置下按常规方式完成

配置


推荐阅读