Почему ASP.NET сгенерировал один и тот же ключ cookie для домена и субдомена? - PullRequest
2 голосов
/ 05 февраля 2009

Ошибка:

У меня есть веб-приложение ASP.NET, которое иногда устанавливает идентичные ключи cookie для «.www.mydomain.com» и «www.mydomain.com». Я пытаюсь выяснить, какой домен cookie по умолчанию устанавливает ASP.NET, и как я случайно закодировал сайт, чтобы иногда добавлять "." в домен cookie.

Когда 2 куки-файла имеют один и тот же ключ и отправляются из браузера, веб-приложение ASP.NET не может их различить, поскольку значение домена не отправлено в заголовке. (См. Мой предыдущий вопрос )

Данные:

Я включил ведение журнала W3C на веб-сервере и проверил, что оба куки отправляются клиентом. Вот пример из файла журнала (в паре для краткости).

80 GET /default.aspx page= 200 0 0 - - - - - +MyCookie2=sessionID=559ddb9b-0f38-4878-bb07-834c2ca9caae;+MyCookie2=sessionID=e13d83cd-eac2-46fc-b39d-01826b91cb2c;

Возможный фактор:

Я использую аутентификацию форм с поддержкой поддоменов.

Вот мои настройки web.config:

<authentication mode="Forms">
<forms domain="mydomain.com" enableCrossAppRedirects="true" loginUrl="/login" requireSSL="false" timeout="5259600" />
        </authentication>

Вот и пример настройки пользовательских файлов cookie:

HttpCookie cookie1 = new HttpCookie("MyCookie1") {HttpOnly = true, Expires = expiration};
logosCookie["email"] = user.Email;
logosCookie["keycode"] = user.PasswordHash;
logosCookie["version"] = currentCookieVersion;
context.Response.Cookies.Remove("cookie1");
context.Response.Cookies.Add(cookie1);

// set FormsAuth cookie manually so we can add the UserId to the ticket UserData
var userData = "UserId=" + user.UserID;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(2, user.Email, now, expiration, true, userData);

string str = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, str)
    {
        HttpOnly = true,
        Path = FormsAuthentication.FormsCookiePath,
        Secure = FormsAuthentication.RequireSSL,
        Expires = ticket.Expiration
    };
if (FormsAuthentication.CookieDomain != null)
{
    cookie.Domain = FormsAuthentication.CookieDomain;
}

context.Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
context.Response.Cookies.Add(cookie1 );

Вот еще один пример установки файла cookie.

var cookie2 = new HttpCookie("MyCookie2");
cookie2[CookieSessionIdKey] = Guid.NewGuid();
cookie2.Expires = DateTime.Now.AddYears(10);
HttpContext.Current.Response.Cookies.Set(cookie2);

Нежелательное разрешение:

Я могу вручную задать для домена cookie определенное значение, но я бы хотел избежать явного объявления домена. Я бы предпочел использовать поведение фреймворка по умолчанию и изменить свое использование ASP.NET, чтобы избежать добавления "." в домен cookie для пользовательских файлов cookie.

1 Ответ

1 голос
/ 25 февраля 2009

Если сервер не указал явно домен в ответе, браузер может назначить значение домена cookie. Я не выяснил, какие именно условия приводят к настройке браузера "www.mydomain.com" против ".mydomain.com" в домене cookie, когда в ответе не указан домен, но это произошло.

У меня такое ощущение, что это результат явной установки значения домена cookie «.ASPAUTH» на «.mydomain.com», чтобы включить перекрестную аутентификацию поддоменов, в то время как для других пользовательских доменов cookie установлено значение по умолчанию (пустая строка или «») .

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

...