azure appservice容器未获得HTTPS方案

问题描述

我有一个简单的asp.net core 3.1应用程序,可在index.cshtml页面中打印出HTTPRequest。 我将应用程序容器化,并在azure appservice中运行它。

我不拥有很多代码,例如Microsoft OIDC东西,它们依赖于HTTPRequest.Scheme来构建重定向URL。进入我的容器化应用的请求是HTTP,即使原始请求的网址看起来像这样;

https://app-chaosbunny.azurewebsites.net/

当我打印出应用程序认为在HTTPRequest中的内容时,我得到了;

http://app-chaosbunny.azurewebsites.net/

不用说,当OIDC的东西构建了redirectUrl时,它就是HTTP方案,这是错误的。

“应用程序服务”有一个TLS / SSL设置,您可以在其中打开“仅HTTPS”。这没有效果

我是否缺少强制实施正确方案的设置,并将其传递给容器?

解决方法

这很可能是由于App Service在前端终止SSL导致的。向您的应用程序所在的工作程序发出的请求始终是HTTP。检查X-Arr-Ssl标头。该标头的存在会告诉您该请求是作为SSL请求传入的。

吉姆

,

proxy docs

没有关于容器的应用服务所发生的一切的具体文档,这个答案可能不正确,但可以。

我发现以下标头是从appService发送到容器化应用的。

X-ARR-SSL   2048|256|C=US,S=Washington,L=Redmond,O=Microsoft Corporation,OU=Microsoft IT,CN=Microsoft IT TLS CA 5|CN=*.azurewebsites.net
X-Forwarded-Proto   https
X-AppService-Proto  https

文档中列出的以下方法对我不起作用。

app.UseForwardedHeaders();

开始代码段

当无法添加转发的标头并且所有请求都是安全的

在某些情况下,可能无法将转发的标头添加到代理到应用程序的请求中。如果代理要求所有公共外部请求均为HTTPS,则可以在使用任何类型的中间件之前在Startup.Configure中手动设置该方案:

C# 复制

app.Use((context,next) =>
{
    context.Request.Scheme = "https";
    return next();
});

可以在开发或登台环境中使用环境变量或其他配置设置禁用此代码。
结束摘要

我将以下代码放在public void Configure(IApplicationBuilder app,IWebHostEnvironment env)的第一行

public void Configure(IApplicationBuilder app,IWebHostEnvironment env)
{
    app.Use(async (context,next) =>
    {
      context.Request.Scheme = "https";
      await next();
    });

    ....
}