Безопасная проверка подлинности с помощью прокси-серверов - PullRequest
3 голосов
/ 16 июня 2011

Мы используем Stunnel (для удаления SSL) и HAProxy на нашем балансировщике нагрузки - который затем отправляет запросы в IIS через HTTP.

Проблема, которую мы имеем, заключается в том, что мы хотим, чтобы наши сайты (ASP.NET)установить cookie-файлы безопасным способом - то есть, установив для атрибута requireSSL значение true.

Когда мы устанавливаем этот атрибут и отправляем HTTPS-запрос на сайт, мы получаем эту ошибку:

The application is configured to issue secure cookies. These cookies require the browser to issue the request over SSL (https protocol). However, the current request is not over SSL.

Можно ли доверять веб-серверу, если запрос приходит по SSL от балансировщика нагрузки?Или это не проблема, так как доступ к нашему сайту возможен ТОЛЬКО по SSL (открыто только 443)?

Ответы [ 2 ]

2 голосов
/ 17 июня 2011

Для пользователей ASP.NET MVC 3, которыми мы являемся, вы также можете справиться с этим с помощью следующего GlobalFilter, который я собрал, который затем может защитить любой файл cookie, отправленный обратно: -

namespace MyNamespace
{
    public class SecureCookiesAttribute : FilterAttribute, IResultFilter
    {
        public void OnResultExecuting(ResultExecutingContext filterContext)
        {
            foreach (string cookieName in filterContext.HttpContext.Response.Cookies.AllKeys)
                filterContext.HttpContext.Response.Cookies[cookieName].HttpOnly = true;

            if (filterContext.HttpContext.Request.IsLocal)
                return;

            foreach (string cookieName in filterContext.HttpContext.Response.Cookies.AllKeys)
                filterContext.HttpContext.Response.Cookies[cookieName].Secure = true;
        }

        public void OnResultExecuted(ResultExecutedContext filterContext) { }
    }
}

Это установит флаг HTTPOnly для любого файла cookie независимо от того, тогда, если запрос поступил из нелокального источника, он также установит флаг безопасности.Это позволяет нам выполнять локальную отладку по протоколу HTTP, а не по протоколу HTTPS (но вы можете просто снять эту проверку, если все, что вы делаете, выполняется по протоколу HTTPS).

2 голосов
/ 17 июня 2011

Вместо этого:

FormsAuthentication.SetAuthCookie(email, false);

попробуйте это:

var cookie = FormsAuthentication.GetAuthCookie(email, false);
cookie.Secure = true;
HttpContext.Current.Response.Cookies.Add(cookie);

Если вы используете ASP.NET MVC, вы также можете использовать глобальный фильтр действий, который устанавливает флаг безопасностина все куки в ответе

...