Cookie для домена не используется для поддоменов - PullRequest
0 голосов
/ 07 июня 2018

Я использую HttpClient в своем приложении, чтобы отправить моего пользователя / пароль в службу, которая возвращает некоторые файлы cookie, которые я позже смогу использовать для всех других моих запросов.Служба расположена по адресу https://accounts.dev.example.com/login и возвращает два файла cookie, которые имеют Domain=.dev.example.com.Проблема, которую я обнаружил, заключается в том, что на некоторых компьютерах (контроллеры домена Windows) эти файлы cookie не используются, когда я запрашиваю ресурсы в поддоменах, таких как https://accounts.dev.example.com/health-check, а в соответствии с MDN документами файлом cookie длядомен может использоваться для запроса ресурсов к поддоменам:

Домен = Необязательно

Указывает те хосты, на которые будет отправляться файл cookie.Если не указан, по умолчанию используется хост-часть текущего местоположения документа (но не включая поддоменов).В отличие от более ранних спецификаций, начальные точки в доменных именах игнорируются. Если указан домен, субдомены всегда включаются.

Знаете ли вы, как правильно настроить HttpClient для передачи файлов cookie домена запросам субдомена?

Немного подробнее:

Файлы cookie, возвращаемые моей службой аутентификации на https://accounts.dev.example.com/login, выглядят так в заголовках HTTP:

Set-Cookie: AK=112233;Version=1;Domain=.dev.example.com;Path=/;Max-Age=5400;Secure;HttpOnly, 
Set-Cookie: AS=445566;Version=1;Domain=.dev.example.com;Path=/;Max-Age=5400;Secure;HttpOnly, 

Затем я могу запросить C #'s CookieContainer с помощьюлюбой из этих вызовов на обычных рабочих станциях:

cookies.GetCookies("https://accounts.dev.example.com")
cookies.GetCookies("https://dev.example.com")

Оба будут возвращать 2 куки, например:

$Version=1; AK=112233; $Path=/; $Domain=.dev.example.com
$Version=1; AS=445566; $Path=/; $Domain=.dev.example.com

Но на других компьютерах (контроллере домена) первый вызов будетверните пустой список, в то время как второй вернет 2 куки.

Почему эта разница в поведении CookieContainer.GetCookies в зависимости от того, на какой машине запущен код?

Мои рабочие станции используют Microsoft Windows 10 Home Single Language (.Net 4.0.30319.42000), а DC используют Microsoft Windows Server 2012 R2 Datacenter (.Net 4.0.30319.36399).

Код

Это модифицированная версия моего кода:

public static async Task<string> DoAuth(CookieContainer cookies,
                                        Dictionary<string, string> postHeaders,
                                        StringContent postBody)
{
    try
    {
        using (var handler = new HttpClientHandler())
        {
            handler.CookieContainer = cookies;
            using (var client = new HttpClient(handler, true))
            {
                foreach (var key in postHeaders.Keys)
                    client.DefaultRequestHeaders.Add(key, postHeaders[key]);

                var response = await client.PostAsync("https://accounts.dev.example.com/login", postBody);
                response.EnsureSuccessStatusCode();

                // This line returns 0 in Domain Controllers, and 2 in all other machines
                Console.Write(cookies.GetCookies("https://accounts.dev.example.com").Count);

                return await response.Content.ReadAsStringAsync();
            }
        }
    }
    catch (HttpRequestException e)
    {
        ...
        throw;
    }
}

1 Ответ

0 голосов
/ 21 июня 2018

Поскольку я не мог найти ответ на этот вопрос (не только в TechNet ), я решил использовать следующее решение, которое работает, но не уверен, существует ли правильный способ решения проблемы.Проблема:

foreach (Cookie cookie in cookies.GetCookies(new Uri("https://dev.example.com")))
{
    cookies.Add(new Uri("https://accounts.dev.example.com"), new Cookie(cookie.Name, cookie.Value, cookie.Path, ".accounts.dev.example.com"));
}

Итак, я дублирую куки для каждого из поддоменов, в которые мое приложение должно отправлять эти куки.

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