在HTTPS请求中,Request.IsSecureConnection返回false



我有一个在https(SSL)中工作的 asp.net 应用程序。这在我的本地计算机和亚马逊AWS(生产环境)中运行良好。

但是当我在办公室托管此应用程序(用于测试)时,发生了一些奇怪的事情。

  1. 我可以看到浏览器中的https和锁定标志。

  2. Fiddler 还显示输出已加密并显示端口 443。

  3. HttpContext.Current.Request.IsSecureConnection返回错误

  4. 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

相关内容

  • 没有找到相关文章

最新更新