asp.net-core - 部署为 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,我很高兴有任何提示。
兴趣点:
- Docker:图像的基础是:
mcr.microsoft.com/dotnet/core/aspnet:3.1
- Azure:身份验证/授权已关闭
- Azure:未安装前门
- 该应用程序正确地为 Swagger UI 提供服务。
- Docker 映像在本地运行良好。
解决方案
以下是我解决问题的方法:事实证明,永久重定向循环的原因是代理在 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 门户中的配置 > 应用程序设置下按常规方式完成:
推荐阅读
- cypress - Cypress 测试依赖于隐藏域
- python - 通过 django 中的方法订购查询集
- vue.js - VueJS 属性或方法“posts”未在实例上定义,但在渲染期间被引用
- c# - 缺少适用于 Mac 的 Visual Studio 的 Blazor WebAssembly 应用模板
- tcl - 将寄存器值读入变量 - 例如 pc 的控制位置
- java - 属性文件中的 Eclipse 法语和俄语字符问题
- bitbucket - Bitbucket Cloud - prevent creation of tags in repository
- java - 如何在 android studio 的 QR 码中使用希腊字母对文本进行编码
- angular - 角度构建中的 AOT 模式添加 `fr.` 或 `en.` 作为 transloco 中翻译键的前缀
- c - 如何使用 MCC 将 I2C 与 XC16 结合使用 - Microchip