Пометка файлов cookie как «безопасных» в формах авторизации, когда сайт находится за балансировщиком нагрузки, обслуживающим сертификат TLS - PullRequest
9 голосов
/ 29 ноября 2011

Недавно у меня возникла небольшая проблема с сайтом на AppHarbor, о которой я писал на их форумах поддержки: Request.IsSecureConnection всегда возвращает false

Короче говоря, потому что балансировщик нагрузкидешифрует трафик HTTPS до того, как он попадет в веб-приложение, такие атрибуты, как Request.IsSecureConnection, и конфигурация, такая как requireSSL, при аутентификации форм не работает должным образом.На самом деле в последнем случае вы даже не можете аутентифицироваться, так как приложение думает, что запрос не приходит по HTTPS.

Это аутентификация форм, что особенно проблематично, потому что без него куки не установлены на«безопасные» и отправляются обратно по HTTP, если сайт доступен только по имени домена и неявно обслуживает небезопасную схему URL.

Какой наилучший обходной путь для этого?Я бы предпочел использовать собственную конфигурацию безопасности. Может ли кто-нибудь найти способ переопределить реализацию, которая проверяет, является ли соединение безопасным?Достаточно просто определить, обслуживался ли запрос по HTTPS (либо на основе Request.Url.Scheme, либо на заголовке X_FORWARDED_FOR), это просто вопрос аккуратной привязки.

Ответы [ 2 ]

5 голосов
/ 19 ноября 2013

Кроме того, вы можете использовать модуль перезаписи URL, чтобы заставить ASP.NET думать, что он работает в контексте HTTPS, и оставить флаги requireSSL на месте (что означает, что файлы cookie будут установлены как безопасные - и доступны только в том случае, есливы действительно работаете под HTTPS)

Вы можете установить в своем файле web.config следующее:

    <rewrite>
        <rules>
            <rule name="HTTPS_AlwaysOn" patternSyntax="Wildcard">
                <match url="*" />
                <serverVariables>
                    <set name="HTTPS" value="on" />
                </serverVariables>
                <action type="None" />
            </rule>
        </rules>
    </rewrite>

Вам также необходимо добавить HTTPS в списокallowServerVariables в applicationHost.config (или через конфигурацию URL REwrite)

        <rewrite>
            <allowedServerVariables>
                <add name="HTTPS" />
            </allowedServerVariables>
        </rewrite>

Благодаря Леви Бродерику из команды ASP.NET, который направил меня в правильном направлении к этому решению!

4 голосов
/ 12 декабря 2011

Отключите параметр RequireSSL и добавьте следующий код в свое приложение. Это должно обеспечить вашу аутентификацию / сеансовые куки.

void Application_EndRequest(object sender, EventArgs e)
{
    if (Response.Cookies.Count > 0)
    {
        foreach (string s in Response.Cookies.AllKeys)
        {
            if (s == FormsAuthentication.FormsCookieName || s.ToLower() == "asp.net_sessionid")
            {
                Response.Cookies[s].Secure = true;
            }
        }
    }
}
...