Вопрос

Я работаю над приложением на основе отдыха, которое подключается к Office365. Приложение будет доступно на нескольких платформах, поэтому я создал библиотеку портативной классы для обработки всей логики, включая аутентификацию. PCL Targets Windows Phone 7.1 и далее и включает в себя библиотеки клиентских библиотек Microsoft HTTP (Nuget), который требуется для приложений Windows Phone 7.1.

Последний шаг аутентификации для Office365 - получить печенье Fedauth с сайта, и именно здесь у меня проблема.

Код, который я использую для получения файла cookie:

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));
.

Переменная «HOST» - это просто URL-адрес сайта Office365, а двоичные возможности, которые я получил от предыдущих запросов. Эти вещи одинаково хорошо работают во всех приложениях: запускаю ли я код PCL из контекста приложения Windows Phone 7.1, приложение Windows Phone 8, приложения Windows 8 или даже приложение консоли, я получаю тот же ответ (см. Ниже), который содержит печенье 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 Переменная «Costecollection» содержит только cookie RTFA '. На других платформах он содержит все три печенья «RPScontextCookie», «RTFA», «Fedauth».

Windows Phone 7.1 отличается от других приложений в том, что это единственная платформа, которая фактически использует httpClient из пакета Nuget. Другие платформы имеют нативный HTTPClient, который поменятся в магии PCL.

Кажется вероятным, что проблема вызвана печеньем Fedauth, не имеющим домена. Я попробовал использовать .getcookies (null) и различных вариантов .getcookies (нового URI ("что-то", riikind.relative)), который все приводит к исключению. Я также попытался изменить большую часть свойств httpClientlerhandler без удачи.

Кто-нибудь столкнулся с этой проблемой, и, возможно, решил ее? Или просто предложение о том, что я мог попробовать?

Ответ, который я получаю на .postasync выше, одинаково на всех платформах, и, согласно Fiddler, нераспределенный ответ:

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>
.

Это было полезно?

Решение

Я нашел ответ здесь: Доступ к Httponly Cookies из Windows Phone 8 / PCL .

Чтение поста, которое я понял, что сделал ошибку выше: я не получил файл cookie 'RTFA в приложении Windows Phone 7.1, но «RPSContextCookie». Печенье, которые я не мог получить доступ, были отмечены Httponly.

Я также понял, что мне не нужно получить доступ к файлам cookie. Вместо этого я мог просто повторно использовать Handler.cookicontainer. Так что мой код теперь выглядит так:

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 - это просто в классовом поле для хранения контейнера cookie. Затем, как только я буду аутентифицирован, и я делаю запросы, которые являются фактическими целями приложения, я делаю следующее:

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

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

Это работает как в Windows Phone 7.1 Приложения, приложения Windows Phone 8, консольные приложения и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top