asp.net-core - Azure Web应用程序部署为docker容器无尽的301循环

标签 asp.net-core azure-web-app-service azure-container-registry

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

到目前为止,我们已成功将镜像推送到 Azure 容器注册表,在那里它会被自动拾取并成功部署到应用服务。不幸的是,该应用程序还不能正常工作。当尝试从我们的 API (GET https://foo.azurewebsites.net/api/configuration) 的(匿名)端点获取一些配置数据时,我没有像以前那样返回数据,而是得到了 301(永久移动)状态代码,该代码完全指向本身:location: https://foo.azurewebsites.net/api/configuration这会导致重定向循环。

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

兴趣点:

  • Docker:镜像的基础是:mcr.microsoft.com/dotnet/core/aspnet:3.1
  • Azure:身份验证/授权已关闭
  • Azure:无 Front Doors已安装
  • 应用正确地服务于 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。所以我们需要启用 header 转发。对于 .NET Core 2.x 应用程序,这意味着遵循 Configure ASP.NET Core to work with proxy servers and load balancers 中解释的步骤。 。幸运的是,对于 ASP.NET Core 3.x 应用程序,有一种更简单的方法(遗憾的是官方文档中尚未提及,但已在 preview 6 公告中提及):只需设置 ASPNETCORE_FORWARDEDHEADERS_ENABLED环境变量设置为true。这可以在 Azure 门户中的配置> 应用程序设置下以常规方式完成:

configuration

关于asp.net-core - Azure Web应用程序部署为docker容器无尽的301循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65779034/

相关文章:

azure - 如何将私钥证书 (.pfx)、公钥证书 (.cer) 上传到 Azure WebApp

azure - 部署 Azure Web 应用程序时对内存位置的访问无效

azure-devops - 在 Azure 中将 Docker 镜像任务推送到 ACR 失败 "unauthorized: authentication required"

Azure Functions 与 Docker 镜像错误 : Azure Functions Runtime is unreachable

azure - 使用 Azure 容器注册表从 C# 创建新的 Azure 容器实例

c# - .NET Core Web api 仅在 IIS 上调用 ERR_CONNECTION_RESET - 其他调用有效

c# - EF Core - 对 Context 的多个异步调用导致错误

c# - 删除 HTTP 服务器和 X-Powered-By header

encryption - 在服务器上安全地加密/解密 appsettings.json

api - 更新 Team Foundation 2015 API 中的构建定义