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

Аутентификация форм с помощью requireSSL = true, не возвращающий cookie с атрибутом Secure

Теперь я вижу странный ответ с нашего сайта IIS, когда мы обновили хост от Win2K3/IIS6 до Win2k8R2/IIS7.5. ASP.Net версия 4.0

У нас есть очень сложное и зрелое веб-приложение, которое использует аутентификацию форм со следующей конфигурацией:

<authentication mode="Forms">
  <forms loginUrl="~/Login" timeout="2000" domain="xx.xx.com" requireSSL="true" />
</authentication>

URL-адрес входа направляется на страницу ASP.Net MVC 3, настроенную для SSL.

Сайт работал как ожидалось в IIS6, но с момента его переноса при успешном входе в файл cookie auth в заголовке ответа отсутствуют атрибуты Secure и HttpOnly. Это проблематично, поскольку у нас есть смешанный контент-сайт со многими страницами HTTP. Файл cookie auth теперь отправляется по каждому запросу, а не только по запросам через HTTPS, и теперь он открыт для уязвимости во время сеанса.

Наша ссылка для выхода успешно отправляет файл cookie с нулевой длиной, который включает атрибуты Secure и HttpOnly.

Здесь исходные ответы после успешного входа и выхода из Fiddler, отредактированные для защиты невинных:)

Login Response:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Set-Cookie: .ASPXAUTH=83FCCA...102D; domain=xx.xx.com; path=/
Date: Fri, 25 Jan 2013 22:53:31 GMT
Content-Length: 84

{...}


Logoff Response:

HTTP/1.1 302 Found

Cache-Control: private
Content-Type: text/html; charset=utf-8
Location: http://xx.xx.com/?...
Set-Cookie: .ASPXAUTH=; domain=xx.xx.com; expires=Tue, 12-Oct-1999 04:00:00 GMT; path=/; secure; HttpOnly
Set-Cookie: logoff=; path=/
Set-Cookie: ...
Date: Fri, 25 Jan 2013 22:57:01 GMT
Content-Length: 64053

<html><head><title>...

Изменение настройки Integrated Pipeline пула приложений не влияет.

Вот важные части кода создания файла cookie:

    var ctx = HttpContextFactory.Current;

    var cookie = new HttpCookie(
        FormsAuthentication.FormsCookieName,
        FormsAuthentication.Encrypt(
            new FormsAuthenticationTicket(
                SessionId,
                false,
                Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
            )
        )
    ) { Domain = domain };

    ctx.Response.Cookies.Add(cookie);

Любые мысли о том, с чего начать искать причину этого?

4b9b3361

Ответ 1

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

var cookie = new HttpCookie(
    FormsAuthentication.FormsCookieName,
    FormsAuthentication.Encrypt(
        new FormsAuthenticationTicket(
            SessionId,
            false,
            Convert.ToInt32(FormsAuthentication.Timeout.TotalMinutes)
        )
    )
) 
{ 
    Domain = domain,
    HttpOnly = true,
    Secure = FormsAuthentication.RequireSSL
};

Поскольку вы создаете файл cookie проверки подлинности форм вручную (вместо использования встроенных методов FormsAuthentication.SetAuthCookie или FormsAuthentication.GetAuthCookie), настройки в вашем web.config не влияют. Вам нужно явно установить их, как показано в моем примере.