Question

Je travaille sur une application de repos qui se connecte à Office365. L'application sera disponible sur plusieurs plates-formes. J'ai donc créé une bibliothèque de classe portable pour gérer toute la logique, y compris l'authentification. Le PCL cible Windows Phone 7.1 et en avant, et inclut les bibliothèques client (Nuget) Microsoft HTTP, qui est requise pour les applications Windows Phone 7.1.

La dernière étape de l'authentification pour Office365 consiste à obtenir un cookie Feduuth sur le site, et c'est là que j'ai un problème.

Le code que j'utilise pour obtenir le cookie est:

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

La variable "hôte" n'est que l'URL du site Office365 et le BinarySecurityToken I obtenu des demandes précédentes. Ces choses fonctionnent également bien dans toutes les applications: si j'exécute le code PCL à partir du contexte d'une application Windows Phone 7.1, de l'application Windows Phone 8, de l'application Windows 8, ou même d'une application de console, je reçois exactement la même réponse (voir ci-dessous), qui contient le cookie feduuth. Ceci j'ai vérifié à l'aide de Fiddler.

Puis j'essaie d'obtenir le cookie pour la réutiliser sur les demandes suivantes.

var cookieCollection = handler.CookieContainer.GetCookies(new Uri(host));
foreach (var cookie in cookieCollection)
{
    if (cookie.Name.StartsWith("FedAuth"))
    {
        //TODO: Store the cookie.
        return true;
    }
}

Ceci conduit au résultat suivant: Sous Windows Phone 7.1, la variable "Cookiecollection" ne contient que le cookie RTFA ". Sur les autres plates-formes, il contient les trois cookies 'RPSContextcookie', 'RTFA', 'FedAuth'.

Windows Phone 7.1 diffère des autres applications en ce que c'est la seule plate-forme qui utilise réellement le httpClient à partir du package Nuget. Les autres plates-formes ont un httpclient natif qui est échangé par la magie de PCL.

Il semble probable que le problème soit causé par le cookie feduuth n'ayant pas de domaine. J'ai essayé d'utiliser .getcookies (NULL) et différentes variations de .getCookies (nouvel URI ("quelque chose", Urikind.Relative)), qui entraînent toutes une exception. J'ai également essayé de changer la plupart des propriétés du HttpClientHandler sans chance.

Quelqu'un a-t-il rencontré ce problème et peut-être résolu? Ou juste une suggestion sur ce que je pourrais essayer?

La réponse que je monte sur le .postasync ci-dessus est la même sur toutes les plates-formes et, selon Fiddler, la réponse brute est la suivante:

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>

Était-ce utile?

La solution

J'ai trouvé une réponse de type ici: Accéder à des cookies httponly de Windows Phone 8 / PCL .

Lire le message J'ai réalisé que j'ai commis une erreur ci-dessus: Je ne recevais pas le cookie "RTFA" dans l'application Windows Phone 7.1, mais le "rpscontextcookie". Les cookies que je ne pouvais pas accéder étaient tous deux marqués avec httponly.

J'ai également réalisé que je n'ai pas besoin d'accéder directement aux cookies. Au lieu de cela, je pouvais simplement réutiliser le gestionnaire.cookiecontainer. Donc, mon code ressemble maintenant à ceci:

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;

Ceci._COOKIECONTAINER n'est qu'un champ de classe pour stocker le conteneur de cookies. Ensuite, une fois que je suis authentifié et que je fais les demandes qui sont le but réel de l'application, je fais ce qui suit:

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

Ainsi, la ligne de fond est: je ne peux pas accéder aux cookies httponly - mais je n'ai pas besoin de. Je viens de réutiliser le conteneur de cookie et les cookies sont automatiquement inclus dans la demande suivante.

Ceci fonctionne à la fois dans Windows Phone 7.1 Apps, Windows Phone 8 Apps, Applications de console, etc.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top