21

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

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

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

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

  3. HttpContext.Current.Request.IsSecureConnection返回false

  4. HttpContext.Current.Request.Url.Scheme返回http

在办公室,我们使用 Juniper SSG 防火墙和 TMG 2010(Forefront Threat Management Gateway 2010)。因此服务器通过 Juniper 和 TMG 2010 接收请求。提前致谢。

4

3 回答 3

18

为了降低成本,我怀疑 SSL 证书安装在 TMG 网关上,并且该网关在将请求传递给实际 Web 服务器时只是将请求重写为标准 HTTP。因此,当请求到达 IIS 和您的 Web 应用程序时,它就是一个标准的纯 HTTP 请求。

于 2012-10-04T11:04:21.963 回答
15

在部署到 Amazon 的 Elastic Beanstalk 环境后,这让我大吃一惊。我看不到任何方法可以让负载平衡器允许 SSL 请求直接通过服务器。相反,它总是在负载平衡器处终止 SSL,并将纯 http 传回服务器。

我找到了这个文档:Elastic Load Balancing Concepts - X-Forwarded Headers

本质上,负载均衡器会在将请求转发到后端服务器之前将许多额外的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.
}
于 2014-12-17T13:05:41.503 回答
0

另一种检查方法是检查端口

if(context.Request.Url.Port == 443)

注意:检查哪个端口用于安全连接,通常是 443

于 2014-03-30T09:13:38.267 回答