如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)

Posted

技术标签:

【中文标题】如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)【英文标题】:How to enforce HTTPS only (no redirect, block HTTP) on Azure App Service / Web App 【发布时间】:2022-01-08 23:39:18 【问题描述】:

Microsoft's own documentation on HSTS 对 HSTS、HTTPS 重定向和 API 说了以下内容:

Web API 应该:

不监听 HTTP。 关闭状态码为 400(错误请求)的连接并且不处理请求。

…通过 HTTP 对 API 的单个经过身份验证的调用会在不安全的网络上存在风险。安全的方法是将 API 项目配置为仅通过 HTTPS 侦听和响应。

我的收获是:API 不应该重定向,因为客户端可能很乐意通过 HTTP 发送敏感数据,并且由于重定向,一切都“正常工作”。即使对于浏览器和使用 HSTS 时,第一个请求(带有潜在敏感数据)也可以使用 HTTP 完成。相反,API 应该失败 HTTP 请求并仅通过 HTTPS 响应。

在花了一天的大部分时间研究这个之后,我发现在 Azure 应用服务/Web 应用中,似乎没有简单的方法来遵循这些建议。无论“HTTPS Only”是打开还是关闭,都可以通过 HTTP 调用 API:如果打开,它会重定向到 HTTPS,如果关闭,它完全可以通过 HTTP 使用而无需重定向。有人会认为有一种简单的方法可以让应用服务/网络应用仅通过 HTTPS 进行侦听。例如,如果“仅 HTTPS”按钮是关闭/重定向/打开。

文件说:

要在 API 中禁用 HTTP 重定向,请设置 ASPNETCORE_URLS 环境变量或使用 --urls 命令行标志。有关详细信息,请参阅 Andrew Lock 的 Use multiple environments in ASP.NET Core 和 5 ways to set the URLs for an ASP.NET Core app。

不幸的是,这两个链接都没有描述这是否与应用服务/Web 应用相关,或者环境变量应该是什么。我无法让它工作。这似乎还需要复制任何自定义域,迫使您记住使环境变量与自定义域的更改保持同步。

如何使 Azure 应用服务/Web 应用仅在 HTTPS 上侦听?

【问题讨论】:

【参考方案1】:

我当前的解决方法是部署以下web.config,具有讽刺意味的是,它要求“仅 HTTPS”关闭,HTTP 请求才能到达应用服务并被拒绝。但是,它确实可以确保不会开发仅 HTTP 的 API 客户端,因为它们从一开始就无法正常工作。

<configuration>
  <system.webServer>
    <rewrite>
      <rules>
        <rule name="Disable HTTP" enabled="true" stopProcessing="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="HTTPS" pattern="off" />
            <add input="WARMUP_REQUEST" pattern="1" negate="true" />
          </conditions>
          <action type="CustomResponse" statusCode="400" statusReason="HTTPS Required" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>
</configuration>

如果有人有更好、更简单或更官方的方法,我很乐意接受这个答案。另外,我不确定WARMUP_REQUEST 部分是否有效(从其他地方复制);如果我将CustomResponse 更改为AbortRequest,插槽交换操作将失败,因为预热请求被丢弃。

【讨论】:

如果您的最终关注点是“我的结论是:API 不应该重定向,因为客户端可能很乐意通过 HTTP 发送敏感数据,并且由于重定向而一切都“正常工作””,那么上面的这条规则是也无用,因为在执行重写规则时初始 HTTP 请求已经到达服务器端。如果包含任何敏感信息,那么坏事已经发生了。正确的做法是阻塞80端口***.com/questions/57981432/… 目标不是阻止某人真正有动机发送一次性 HTTP 请求(并得到错误)。目标是避免使用 HTTP 的开发不佳的 API 客户端。只要 API 不能通过 HTTP(直接或通过重定向)工作,开发人员就不会创建通过 HTTP 发送数据的客户端。使用重定向,API 客户端开发人员可以使用 HTTP 而不是更明智,因为浏览器或其他软件可以透明地处理重定向。但如果 API 对 HTTP 请求返回错误,则此类 API 客户端将永远不会被用户发布和使用。

以上是关于如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)的主要内容,如果未能解决你的问题,请参考以下文章

如何强制我的本地 Azure 函数服务器使用 HTTP 2.0 而不是 1.1?

Azure Service Fabric - 如何配置容器被强制终止之前的时间间隔

从 azure web 应用程序提供 logstash。如何?

如何在 Azure 移动 Web 应用中获取基本用户信息?

如何在 HighChart 的 yAxis 上仅显示整数值?

如何在没有管理员权限的 Azure Web 应用上安装 PowerShell 模块?