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
returningfalse
even when the request is over HTTPS.
原因如下:
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/