Tom*_*len 9 c# asp.net ssl https azure
context.Request.IsSecureConnection
Run Code Online (Sandbox Code Playgroud)
即使通过 HTTPS 提供连接,在 Azure 部署中也始终返回 false 。在查看为 Azure 部署站点发送的标头后,我发现:
X-Forwarded-Proto=https
Run Code Online (Sandbox Code Playgroud)
此标头是否保证客户端与网站的连接与 HTTPS 相同context.Request.IsSecureConnection?
.NET Framework 4.7 和 ASP.NET Core 2.0 上的 ASP.NET 不再需要我的答案中提到的自定义检查。
如果请求源自 Azure 应用服务中的 HTTPS,则HttpContext.Request.IsHttps(Core) 和两者都HttpContext.Request.IsSecureConnection将返回True。
这就是我测试过的,它可能在这些堆栈的生命周期中发生得更早(例如 .NET Framework 4.6.x)。无论如何,您应该没问题,因为应用服务现在在 .NET Framework 4.7 之上运行您的应用程序。
您很可能必须检查任何其他编程堆栈。
我不是在问如何强制使用 HTTPS,而是问为什么即使请求通过 HTTPS ,Azure 部署也会
context.Request.IsSecureConnection返回false。
原因如下:
Azure 应用服务前端层终止TLS 通道(又名 TLS 卸载)并打开一个新的普通 HTTP连接到您的 Web Worker,您的代码所在的位置。路由由ARR(应用程序请求路由)执行。
来源:
https : //channel9.msdn.com/Events/TechEd/NorthAmerica/2012/AZR305
(查看幻灯片,幻灯片 12)
因此,从您的代码的角度来看,每个请求都是“不安全的”。
X-Forwarded-Proto=https 关于原始请求的提示(命中前端)。
如果必须进行检查,则改为进行检查X-ARR-SSL。
ARR 为通过 HTTPS 到达的每个请求附加一个特殊的请求标头。中包含的值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
Run Code Online (Sandbox Code Playgroud)
这里有更多信息:https :
//tomasz.janczuk.org/2013/12/secure-by-default-with-ssl-in-windows.html
Tomasz 是iisnode项目的作者,该项目是在 Azure 应用服务中的 IIS 上运行 Node 应用程序的机制。
应用服务使用应用程序请求路由,这也是 TLS 的终止点。由于到达您的 Web Worker 的流量将是纯 HTTP,您需要检查此标头以判断请求是否源自 TLS:
if (request.headers['x-arr-ssl'])
{
// We're good
}
else
{
// Request made over plain HTTP
}
Run Code Online (Sandbox Code Playgroud)
如果您在 .NET Framework 4.7 或 .NET Core 2.0 上运行,则无需进行此检查,逻辑已烘焙HttpContext.Request.IsSecureConnection和HttpContext.Request.IsHttps(.NET Core)返回正确值。
| 归档时间: |
|
| 查看次数: |
2964 次 |
| 最近记录: |