Так что у меня есть обходной путь для этого, однако, если у кого-то есть идеи получше, не стесняйтесь комментировать. По сути, вам необходимо перехватить ответ в конце запроса и вручную установить свойство Secure в файле cookie проверки подлинности форм, что довольно очевидно, вам также нужно будет установить для свойства requireSSL в конфигурации проверки подлинности формы значение false. Также имейте в виду, что мы не хотим включать HTTPS для всего сайта для аутентифицированных пользователей, поэтому это обходной путь.
В этом подходе есть несколько предостережений и несколько моментов, о которых следует помнить.
Во время тестирования я обнаружил, что cookie-файл проверки подлинности форм всегда записывался в ответ, поэтому я продолжал перезаписывать действительный cookie-файл проверки подлинности в браузере пустым cookie-проверкой подлинности, чтобы обойти это, я включил некоторую логику в Модуль HTTP, чтобы обойти это, см. Фрагмент кода ниже.
Все запросы к приложению, требующие авторизации, должны выполняться по протоколу SSL, в противном случае запрос не будет содержать файл cookie для аутентификации для аутентификации пользователя.
Поскольку вы передаете только файл cookie аутентификации для запросов SSL, вам понадобится другой механизм, чтобы сообщить вашему приложению, что текущий пользователь проходит проверку подлинности, когда они просматривают области сайта без SSL, я реализовал это с дополнительным cookie, который устанавливается, когда пользователь входит в систему, и не имеет установленной даты истечения срока действия, поэтому срок его действия истекает в конце сеанса пользователя, конечно, этот cookie удаляется, если пользователь выходит из системы.
Ниже приведена логика, реализованная в модуле HTTP для воздействия на вышесказанное, я тестировал это последние пару часов и пока не сталкивался с какими-либо проблемами, я обязательно обновлю этот пост, если сделаю!
Мы должны когда-либо отправлять куки аутентификации клиенту, только если пользователь только что вошел в систему, вот логика
- Если запрос имеет cookie-файл авторизации, пользователь уже аутентифицирован
и в соответствии с SSL, поэтому убедитесь, что мы не отправляем новый файл cookie авторизации в
ответ.
- Если в запросе нет куки-файла авторизации, но есть действительный
auth cookie в ответе, установите auth cookie ответа в безопасное состояние,
поэтому он передается только браузером по протоколу SSL.
- Если в запросе нет куки-файла авторизации, а в ответе есть
недействительный или пустой 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);
}
}
}
}