Я использую 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;
}
}