【问题标题】:How to enforce HTTPS only (no redirect, block HTTP) on Azure App Service / Web App如何在 Azure 应用服务/Web 应用上仅强制执行 HTTPS(无重定向、阻止 HTTP)
【发布时间】: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 Core5 ways to set the URLs for an ASP.NET Core app

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

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

【问题讨论】:

    标签: asp.net-core iis azure-web-app-service


    【解决方案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端口stackoverflow.com/questions/57981432/…
    • 目标不是阻止某人真正有动机发送一次性 HTTP 请求(并得到错误)。目标是避免使用 HTTP 的开发不佳的 API 客户端。只要 API 不能通过 HTTP(直接或通过重定向)工作,开发人员就不会创建通过 HTTP 发送数据的客户端。使用重定向,API 客户端开发人员可以使用 HTTP 而不是更明智,因为浏览器或其他软件可以透明地处理重定向。但如果 API 对 HTTP 请求返回错误,则此类 API 客户端将永远不会被用户发布和使用。
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2017-09-08
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多