1

Я работаю над приложением 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> 

ответ

1

Я нашел ответ рода здесь: Accessing HTTPOnly cookies from Windows Phone 8/PCL.

Чтение сообщения Я понял, что сделал ошибку выше: я не получал cookie 'rtFa' в приложении Windows Phone 7.1, но «RpsContextCookie». Куки, которые я не мог получить, были отмечены как HttpOnly.

Я также понял, что мне не нужно напрямую обращаться к куки. Вместо этого я мог бы просто повторно использовать обработчик. CookieContainer. Так что мой код теперь выглядит следующим образом:

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)); 
this._cookieContainer = handler.CookieContainer; 
return true; 

this._cookieContainer просто класс-Scoped поле для хранения контейнера печенья.Затем, когда я заверен и я делаю запросы, которые фактическая цель приложения, я делаю следующее:

var handler = new HttpClientHandler(){ CookieContainer = this._cookieContainer }; 
var client = new HttpClient(handler); 
var response = await client.GetAsync(host + "something"); 

Таким образом, нижняя строка: Я не могу получить доступ к HTTPOnly печенья - но я не Не нужно. Я просто повторно использую контейнер cookie, и файлы cookie автоматически включаются в следующий запрос.

Это работает как в Windows Phone 7.1 приложений, телефон 8 приложений Windows, приложения консоли и т.д.

+1

Если вы повторно использовать тот же самый HttpClient экземпляр для жизни приложения, вам даже не придется беспокоиться о переназначение файла cookiecontainer –

+0

Мне нужно хотя бы повторно использовать контейнер cookie. Все, что на более высоком уровне, которое также включает это - например, экземпляр HttpClient, или некоторый класс-оболочка, который содержит экземпляр HttpClient, также является допустимым выбором. –

Смежные вопросы