2012-10-04 169 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 –