1

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

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

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

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

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

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

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

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

4

2 回答 2

0

这很可能是因为应用服务在前端终止 SSL 的事实。向您的应用所在的工作人员发出的请求始终是 HTTP。检查 X-Arr-Ssl 标头。该标头的存在告诉您请求是作为 SSL 请求进入的。

吉姆

于 2020-08-13T15:20:20.940 回答
0

代理文档

如果没有关于 azure 容器应用服务发生情况的具体文档,这个答案可能不正确,但它可以工作。

我发现以下标头从 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();

开始片段

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

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

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();
    });

    ....
}
于 2020-08-13T23:04:12.647 回答