문제

Office365에 연결하는 REST 기반 앱에서 작업하고 있습니다. 이 응용 프로그램은 여러 플랫폼에서 사용할 수 있으므로 인증을 포함하여 모든 논리를 처리하는 휴대용 클래스 라이브러리를 만들었습니다. PCL은 Windows Phone 7.1 및 Onwords를 대상으로하며 Windows Phone 7.1 응용 프로그램에 필요한 Microsoft HTTP 클라이언트 라이브러리 (nuget)를 포함합니다.

Office365의 인증의 마지막 단계는 사이트에서 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));
.

'호스트'변수는 Office365 사이트의 URL이며 이전 요청에서 얻은 BinarySecurityToken입니다. 이러한 것들은 모든 앱에서 똑같이 잘 작동합니다. Windows Phone 7.1 응용 프로그램, Windows Phone 8 App, Windows 8 응용 프로그램 또는 콘솔 응용 프로그램의 컨텍스트에서 PCL 코드를 실행하는지 여부는 동일한 응답을 얻고 있습니다 ( 아래), Fedauth 쿠키가 포함되어 있습니다. 이것은 Fiddler를 사용하여 확인했습니다.

그런 다음 이후의 요청에 따라 쿠키를 재사용하도록 노력합니다.

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 만 포함됩니다. 다른 플랫폼에서는 세 개의 쿠키의 RPSContextCookie ','RTFA ','Fedauth '를 모두 포함합니다.

Windows Phone 7.1은 다른 앱과 다릅니다.이 플랫폼은 실제로 NuGet 패키지에서 HttpClient를 실제로 사용하는 유일한 플랫폼입니다. 다른 플랫폼에는 PCL 마법으로 스왑 된 기본 HTTPClient가 있습니다.

도메인이없는 Fedauth 쿠키에 의해 문제가 발생할 수 있습니다. 나는 .getcookies (null)를 사용하여, 그래서 모든 것을 예외를 초래하는 것으로 나타났습니다. 나는 또한 운을없이 HttpClientHandler의 대부분의 속성을 변경하려고 시도했다.

이 문제가 발생했고 아마도 그것을 해결했을 것입니다. 또는 내가 시도 할 수있는 것에 대한 제안은 무엇입니까?

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

도움이 되었습니까?

해결책

여기에 종류의 답변을 찾았습니다. Windows Phone 8 / PCL에서 HttpOnly 쿠키 액세스 .

위의 오류가 발생했음을 깨달았습니다. Windows Phone 7.1 앱에서 'RTFA'쿠키를 얻지 못했지만 '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는 쿠키 컨테이너의 저장을위한 클래스 범위 필드 일뿐입니다. 그런 다음 내가 인증되면 앱의 실제 목적 인 요청을 수행하면 다음을 수행합니다.

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

하단 줄은 httponly 쿠키에 액세스 할 수 없습니다 -하지만 필요하지 않습니다. 나는 단지 쿠키 컨테이너를 재사용하고 쿠키는 다음 요청에 자동으로 포함됩니다.

Windows Phone 7.1 응용 프로그램, Windows Phone 8 응용 프로그램, 콘솔 응용 프로그램 등에서 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top