Подтвердить что ты не робот

В запросе 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. Спасибо заранее.

4b9b3361

Ответ 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