Защита cookie для проверки подлинности с помощью форм при разгрузке SSL - PullRequest
7 голосов
/ 28 октября 2010

Я пытаюсь защитить веб-сайт, который я в настоящее время разрабатываю, с использованием ASP.NET MVC 2.0 и проверки подлинности на основе форм. Чтобы защитить cookie-файл для проверки подлинности с помощью форм, я хочу установить для свойства requireSSL значение true, чтобы cookie-файлы отправлялись браузерами только при подключении по SSL и, очевидно, гарантировали, что все ресурсы, для которых требуется авторизация, защищены по SSL.

Моя проблема в том, что мы используем маршрутизацию запросов приложений для выполнения ряда функций, одной из которых является разгрузка SSL, поэтому к тому времени, когда запрос попадает на любой веб-сервер в нашей ферме, запрос уже не находится под SSL и FormsAuthentication.SetAuthCookie метод завершается ошибкой, поскольку для установки файла cookie требуется SSL-соединение, если задано значение requireSSL.

У кого-нибудь есть идеи, как работать здесь!

Спасибо

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Так что у меня есть обходной путь для этого, однако, если у кого-то есть идеи получше, не стесняйтесь комментировать. По сути, вам необходимо перехватить ответ в конце запроса и вручную установить свойство Secure в файле cookie проверки подлинности форм, что довольно очевидно, вам также нужно будет установить для свойства requireSSL в конфигурации проверки подлинности формы значение false. Также имейте в виду, что мы не хотим включать HTTPS для всего сайта для аутентифицированных пользователей, поэтому это обходной путь.

В этом подходе есть несколько предостережений и несколько моментов, о которых следует помнить.

  1. Во время тестирования я обнаружил, что cookie-файл проверки подлинности форм всегда записывался в ответ, поэтому я продолжал перезаписывать действительный cookie-файл проверки подлинности в браузере пустым cookie-проверкой подлинности, чтобы обойти это, я включил некоторую логику в Модуль HTTP, чтобы обойти это, см. Фрагмент кода ниже.

  2. Все запросы к приложению, требующие авторизации, должны выполняться по протоколу SSL, в противном случае запрос не будет содержать файл cookie для аутентификации для аутентификации пользователя.

  3. Поскольку вы передаете только файл cookie аутентификации для запросов SSL, вам понадобится другой механизм, чтобы сообщить вашему приложению, что текущий пользователь проходит проверку подлинности, когда они просматривают области сайта без SSL, я реализовал это с дополнительным cookie, который устанавливается, когда пользователь входит в систему, и не имеет установленной даты истечения срока действия, поэтому срок его действия истекает в конце сеанса пользователя, конечно, этот cookie удаляется, если пользователь выходит из системы.

Ниже приведена логика, реализованная в модуле HTTP для воздействия на вышесказанное, я тестировал это последние пару часов и пока не сталкивался с какими-либо проблемами, я обязательно обновлю этот пост, если сделаю!


Мы должны когда-либо отправлять куки аутентификации клиенту, только если пользователь только что вошел в систему, вот логика

  1. Если запрос имеет cookie-файл авторизации, пользователь уже аутентифицирован и в соответствии с SSL, поэтому убедитесь, что мы не отправляем новый файл cookie авторизации в ответ.
  2. Если в запросе нет куки-файла авторизации, но есть действительный auth cookie в ответе, установите auth cookie ответа в безопасное состояние, поэтому он передается только браузером по протоколу SSL.
  3. Если в запросе нет куки-файла авторизации, а в ответе есть недействительный или пустой cookie-файл auth, убедитесь, что мы удалили cookie-файл ответа поэтому мы не перезаписываем действительный файл cookie в браузере клиента.
private void EndRequest(object sender, EventArgs e)
{
    var application = (HttpApplication)sender;

    if (ValidRequest(application.Request) && application.Response.Cookies.Count > 0)
    {

        //only do the below if the user is not logging out the site, if the user is logging out we can 
        //leave the default forms authentication behaviour which is to expire the auth cookie
        if (application.Request.AppRelativeCurrentExecutionFilePath != "~/authentication/logoff")
        {
            var requestAuthCookie = application.Request.Cookies[FormsAuthentication.FormsCookieName];
            var responseAuthCookie = application.Response.Cookies[FormsAuthentication.FormsCookieName];

            if (requestAuthCookie != null && responseAuthCookie != null && responseAuthCookie.Value.IsNullOrEmpty())
            {
                application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            }
            else if (responseAuthCookie != null && !responseAuthCookie.Value.IsNullOrEmpty())
            {
                responseAuthCookie.Secure = true;
                application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
                application.Response.Cookies.Add(responseAuthCookie);
            }
            else if (responseAuthCookie == null || responseAuthCookie.Value.IsNullOrEmpty())
            {
                application.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
            }
        }
    }
}
2 голосов
/ 23 августа 2012

Разгрузка SSL должна позволять вам устанавливать соединение SSL от оффлоадера SSL к веб-серверу.

Соединение SSL от SSL Offloader к веб-серверу должно использовать самое легкое и быстрое (и, возможно, самое слабое) шифрование.

Это позволяет вам использовать безопасные куки-файлы, снижать нагрузку на шифрование на серверах и избегать изменения вашего кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...