2012-10-04 113 views
19

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

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

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

  2. 的Fiddler还示出了输出被加密,并示出了端口443

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

  4. 而且HttpContext.Current.Request.Url.Scheme返回HTTP

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

回答

15

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

+0

TMG安装的SSL证书 –

+0

好吧,所以这解释了这种行为。 TMG在将请求传递给Web服务器之前重写请求。 –

+5

@JomyJohn如果SSL *在TMG终止*,那么ASP.NET是正确的:到ASP.NET的请求不是https –

0

那么另一种方式来检查是检查端口

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

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

+0

这不起作用,因为web服务器仍然将请求视为端口80. – Aki

+0

@Aki您可能是对的,但在描述“Jomy “提到在提琴手他看到端口443 .... –

+2

我认为这是因为提琴手会显示客户端和负载均衡器之间的加密(端口443)请求。但负载均衡器和Web服务器之间的请求将显示端口80,这就是ASP.NET所看到的。 – Aki

12

这绊倒我最多部署到Amazon的弹性魔豆后环境。我看不到任何方式让负载均衡器允许SSL请求直接通向服务器。相反,它始终在负载平衡器处终止SSL,并将纯http传回服务器。

我发现这个文档:Elastic Load Balancing Concepts - X-Forwarded Headers

基本上,负载平衡器在将每个请求转发给后端服务器之前,会向其中注入一些额外的HTTP Headers。最相关的是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. 
} 
+0

相关资源:http://www.bugdebugzone.com/2013/12/identifying-https-or-ssl-connection-in.html –