Ошибка:
У меня есть веб-приложение ASP.NET, которое иногда устанавливает одинаковые ключи файлов cookie для ".www.mydomain.com" и "www.mydomain.com". Я пытаюсь выяснить, какой пакет cookie домена cookie по умолчанию установлен, и как я случайно закодировал сайт, чтобы иногда добавлять ".". к домену cookie.
Когда 2 куки имеют один и тот же ключ и отправляются из браузера, веб-приложение ASP.NET не может различать эти два, потому что значение домена не отправляется в заголовке. (См. Мой предыдущий вопрос)
Доказательства:
Я включил ведение журнала W3C на веб-сервере и подтвердил, что оба файла cookie отправляются от клиента. Вот пример из файла журнала (сокращенный для краткости).
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.