Я работаю над приложением REST, которое подключается к Office365. Приложение будет доступно на нескольких платформах, поэтому я создал переносимую библиотеку классов для обработки всей логики, включая проверку подлинности. PCL нацелен на Windows Phone 7.1 и далее и включает в себя клиентские библиотеки Microsoft HTTP (NuGet), необходимые для приложений Windows Phone 7.1.Отзыв PCL HttpClient игнорирует файлы cookie без домена
Последним шагом аутентификации для Office365 является получение файла cookie FedAuth с сайта, и именно там у меня возникла проблема.
код я использую, чтобы получить печенье: переменная
var handler = new HttpClientHandler();
handler.AllowAutoRedirect = false;
var newClient = new HttpClient(handler);
var newResponse = await newClient.PostAsync(host + "/_forms/default.aspx?wa=wsignin1.0", new StringContent(binarySecurityToken));
В «хозяина» является только URL сайта Office365 и BinarySecurityToken я получил от предыдущих запросов. Все это одинаково хорошо работает во всех приложениях: я запускаю код PCL из контекста приложения Windows Phone 7.1, приложения Windows Phone 8, приложения Windows 8 или даже приложения консоли, я получаю точно такой же ответ (см. ниже), в котором содержится файл cookie FedAuth. Это я проверил с помощью Fiddler.
Затем я пытаюсь использовать cookie для повторного использования при последующих запросах.
var cookieCollection = handler.CookieContainer.GetCookies(new Uri(host));
foreach (var cookie in cookieCollection)
{
if (cookie.Name.StartsWith("FedAuth"))
{
//TODO: Store the cookie.
return true;
}
}
Это приводит к следующему результату: В Windows Phone 7.1 переменная 'cookieCollection' содержит только печенье rtFa». На других платформах он содержит все три файла cookie «RpsContextCookie», «rtFa», «FedAuth».
Windows Phone 7.1 отличается от других приложений тем, что это единственная платформа, которая фактически использует HttpClient из пакета NuGet. Другие платформы имеют собственный HttpClient, который заменяется магией PCL.
Похоже, что проблема вызвана тем, что файл cookie FedAuth не имеет домена. Я попытался использовать .GetCookies (null) и различные варианты .GetCookies (новый Uri («что-то», UriKind.Relative)), которые все приводят к исключению. Я также попытался изменить большинство свойств HttpClientHandler без везения.
Неужели кто-нибудь столкнулся с этой проблемой и, возможно, решил ее? Или просто предложение о том, что я могу попробовать?
Ответ я получаю на .PostAsync выше одинаково на всех платформах, и в соответствии с Скрипач необработанный ответ:
HTTP/1.1 302 Found
Cache-Control: no-cache, no-store
Pragma: no-cache
Content-Type: text/html; charset=utf-8
Expires: -1
Location:/
Server: Microsoft-IIS/7.5
X-SharePointHealthScore: 0
X-AspNet-Version: 4.0.30319
Set-Cookie: RpsContextCookie=; path=/
Set-Cookie: rtFa=+13jGMMp0A0V+driESaO30ixYclFCRjEvS2jMSwXPfQcrefiJvLEExxYu7V+1JZHM6X5JWeuL70jb3/N/Q/hUTwoAiC/XLJZ1QfERi4aUt8AAVF4ekcNyMdWnj65foDwPkhaV5z8whNSZQigBFD/2Vc1xMTH0ukHbS4cbtJO5U28/4g66vgIZg7dGpNOZg2jDt+HF3GSQ4/W+T1oS9/F5e+Pbwd0p8mqPhkGjL+M7IptmkeHoIqVcS4Ps25dM6q1AniLiv/3NujYmrQjseaEYZ2aaCfc7ZHX7LygBZm8KsoGNyTYRPmC+hZ7tsDq6wfto+xVpX1scggsU0+Qty3DPWUiwy1bBy8JR0znFG0+eDt9uBOQzqfOSjVvd8WNIKUFIAAAAA==; domain=sharepoint.com; path=/; HttpOnly
Set-Cookie: FedAuth=77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48U1A+RmFsc2UsMGguZnxtZW1iZXJzaGlwfDEwMDMwMDAwODc5MTUwMGVAbGl2ZS5jb20sMCMuZnxtZW1iZXJzaGlwfHRtakB3aWxkY293Lm9ubWljcm9zb2Z0LmNvbSwxMzAzNDIwOTYxNDAxMTIxMzMsRmFsc2UsV2lSQjlUVTdOSTk0MUpKRWZ5d1JDNTFPYUphMVpWNkJqWWdaVGM3MU00U3lqL2VkTnF6dVJpbXdEMnpEWk9oR1lybkFsNnpWb3M4V0FBZDk1VVYrZkt5dlkwQ3dqRTlyaEhEc256bkZUeENoODU1Rm1JZmxoYVBkMTFQS2VjWnFJN0N4OUxUOHk4enZDaVNUTGNQMzR2K3NOeHk1YXBMZ2NIWDNHR3JMcG1Ic24rQzAzUkUzakNDQWhma2F3RVRQbk03R3JycVk5amJseHJmNVNhNHZxMk91NlN1cGszZnpQMUZQTzJBc1UrRXZvSDgvWTllR2Y3c2x2dStvMnVlN3hZLy9VQ1lYU1U4b3AzckZ6c2laK0wwN1NrUnZYMTZjVklUVVZJZ0x6TGIxaTJLd2lwNGp6RHgwRFdmVWF0Rk42UVFaNWhHRzMyOHRJZjI2RXo4YldnPT0saHR0cHM6Ly93aWxkY293LnNoYXJlcG9pbnQuY29tLzwvU1A+; path=/; secure; HttpOnly
SPRequestGuid: 5bb2689c-d7c5-c07c-4890-ee32437f15f5
request-id: 5bb2689c-d7c5-c07c-4890-ee32437f15f5
SPRequestDuration: 125
SPIisLatency: 2
X-Powered-By: ASP.NET
MicrosoftSharePointTeamServices: 16.0.0.2308
X-Content-Type-Options: nosniff
X-MS-InvokeApp: 1; RequireReadOnly
P3P: CP="ALL IND DSP COR ADM CONo CUR CUSo IVAo IVDo PSA PSD TAI TELo OUR SAMo CNT COM INT NAV ONL PHY PRE PUR UNI"
Date: Thu, 09 Jan 2014 21:46:53 GMT
Content-Length: 118
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/">here</a>.</h2>
</body></html>
Если вы повторно использовать тот же самый HttpClient экземпляр для жизни приложения, вам даже не придется беспокоиться о переназначение файла cookiecontainer –
Мне нужно хотя бы повторно использовать контейнер cookie. Все, что на более высоком уровне, которое также включает это - например, экземпляр HttpClient, или некоторый класс-оболочка, который содержит экземпляр HttpClient, также является допустимым выбором. –