c# - 当前请求是否通过 Azure 部署通过 SSL 发出

标签 c# asp.net azure ssl https

context.Request.IsSecureConnection

在 Azure 部署中始终返回 false 即使是通过 HTTPS 提供连接。查看为 Azure 部署站点发送的 header 后,我发现:

X-Forwarded-Proto=https

此 header 是否能像 context.Request.IsSecureConnection 一样保证客户端与网站的连接采用 HTTPS?

最佳答案

重要提示:

.NET Framework 4.7 和 ASP.NET Core 2.0 上的 ASP.NET 不再需要我的答案中提到的自定义检查。

如果请求在 Azure 中通过 HTTPS 发起,则 HttpContext.Request.IsHttps(核心)和 HttpContext.Request.IsSecureConnection 都将返回 True应用服务。

这就是我测试的内容,它可能在这些堆栈的生命周期中发生得更早(例如.NET Framework 4.6.x)。无论如何,您都应该没问题,因为应用服务现在在 .NET Framework 4.7 之上运行您的应用程序。

您很可能必须检查任何其他编程堆栈。

<小时/>

I'm not asking how to force HTTPS, I'm asking why in Azure deployment is context.Request.IsSecureConnection returning false even when the request is over HTTPS.

原因如下:

Azure App Service Application Request Routing

Azure 应用服务前端层终止 TLS channel (也称为 TLS 卸载),并打开一个新的纯 HTTP 连接到您的代码所在的 Web Worker。路由由 ARR 执行(应用程序请求路由)。

来源:
https://channel9.msdn.com/Events/TechEd/NorthAmerica/2012/AZR305
(查看幻灯片,幻灯片 12)

因此,从代码的角度来看,每个请求都是“不安全的”。

X-Forwarded-Proto=https 有关原始请求(到达前端)的提示。

如果必须进行检查,请改为针对 X-ARR-SSL 进行检查。

ARR 正在为通过 HTTPS 到达的每个请求附加一个特殊的请求 header 。 X-ARR-SSL 中包含的值提供有关用于保护客户端(即浏览器)和 ARR 前端之间的 TCP 连接的 TLS 服务器证书的信息。

例如:

X-ARR-SSL: 2048|256|C=US, S=Washington, L=Redmond, O=Microsoft Corporation,
           OU=Microsoft IT, CN=Microsoft IT SSL SHA2|CN=*.azurewebsites.net

有关此的更多信息:
https://tomasz.janczuk.org/2013/12/secure-by-default-with-ssl-in-windows.html

Tomasz 是 iisnode 的作者项目,这是在 Azure 应用服务中的 IIS 上运行节点应用程序的机制。


执行摘要

应用服务使用应用程序请求路由,这也是 TLS 终止的点。由于到达 Web Worker 的流量将是纯 HTTP,因此您需要检查此 header 以判断请求是否源自 TLS:

if (request.headers['x-arr-ssl'])
{
    // We're good
}
else
{
    // Request made over plain HTTP
}

如果您在 .NET Framework 4.7 或 .NET Core 2.0 上运行,则无需进行此检查,逻辑已内置,可为 HttpContext.Request.IsSecureConnection 返回正确的值和 HttpContext.Request.IsHttps (.NET Core)。

关于c# - 当前请求是否通过 Azure 部署通过 SSL 发出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38501618/

相关文章:

c# - 异步复制目录及其内容

c# - 日期选择器不适用于更新面板

c# - EF Core - 唯一的、索引的、自动生成的非主键的 guid 列

c# - 指导我进行共享点开发

javascript - 打开新窗口后重定向 ASP.Net 页面

android - 如何将2个for循环的数据存储在列表中?

azure - 在一个 DocumentDb 集合中存储不同的文档类型

c# - 为 NSUncaughtExceptionHandler 引发异常

asp.net - 正则表达式用于测试范围内任意字符的数量

azure - 二头肌 : policy remediation task complains about missing parameter