В запросе HTTPS Request.IsSecureConnection возвращает false
У меня есть приложение asp.net, работающее в https (SSL). Это хорошо работает на моем локальном компьютере и Amazon AWS (производственная среда).
Но когда я размещаю это приложение в офисе (для тестирования), происходят некоторые странные вещи.
-
Я вижу https в браузере и знаке блокировки.
-
Fiddler также показывает, что выход зашифрован и отображает порт 443.
-
Но HttpContext.Current.Request.IsSecureConnection
возвращает false
-
И HttpContext.Current.Request.Url.Scheme
возвращает http.
В офисе мы используем брандмауэр Juniper SSG и TMG 2010 (Forefront Threat Management Gateway 2010). Таким образом, сервер получает запрос через Juniper и TMG 2010. Спасибо заранее.
Ответы
Ответ 1
Чтобы снизить затраты, я подозреваю, что SSL-сертификат установлен на шлюзе TMG и что этот шлюз просто переписывает запрос на стандартный HTTP при передаче его на фактический веб-сервер. Таким образом, к моменту, когда запрос попадает в IIS и ваше веб-приложение, это стандартный простой HTTP-запрос.
Ответ 2
Это отключило меня после развертывания в среде 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.
}
Ответ 3
Ну, еще один способ проверить - проверить порт
if(context.Request.Url.Port == 443)
Примечание: проверьте, какой порт используется для защищенных соединений, обычно это 443