我有一个在https(SSL)中工作的 asp.net 应用程序。这在我的本地计算机和亚马逊AWS(生产环境)中运行良好。
但是当我在办公室托管此应用程序(用于测试)时,发生了一些奇怪的事情。
-
我可以看到浏览器中的https和锁定标志。
-
Fiddler 还显示输出已加密并显示端口 443。
-
但
HttpContext.Current.Request.IsSecureConnection
返回错误 -
HttpContext.Current.Request.Url.Scheme
返回 http。
在办公室,我们使用瞻博网络 SSG 防火墙和 TMG 2010(前沿威胁管理网关 2010)。因此,服务器通过瞻博网络和 TMG 2010 接收请求。提前谢谢。
为了降低成本,我怀疑 SSL 证书安装在 TMG 网关上,并且该网关只是在将请求传递到实际 Web 服务器时将其重写为标准 HTTP。因此,当请求命中 IIS 和您的 Web 应用程序时,它是一个标准的纯 HTTP 请求。
这让我在部署到 Amazon 的 Elastic Beanstalk 环境后陷入困境。我看不到任何方法可以让负载均衡器允许 SSL 请求直接通过服务器。相反,它总是在负载均衡器上终止SSL,并将纯http传递回服务器。
我找到了这个文档:弹性负载平衡概念 - X 转发标头。
实质上,负载均衡器在每个请求转发到后端服务器之前,会向每个请求注入大量额外的 HTTP 标头。最相关的是X-Forwarded-Proto
,它跟踪用于从客户端浏览器连接到负载均衡器的协议。可以这样检查:
var loadbalancerReceivedSSLRequest = string.Equals(Request.Headers["X-Forwarded-Proto"], "https");
var serverReceivedSSLRequest = Request.IsSecureConnection;
if (loadbalancerReceivedSSLRequest || serverReceivedSSLRequest)
{
// SSL in use.
}
else
{
// SSL not in use.
}
另一种检查方法是检查端口
if(context.Request.Url.Port == 443)
注意:检查哪个端口用于安全连接,通常是443