2014-11-21 1 views
2

ADAL 라이브러리를 사용하여 Azure Active Directory 사용자를 인증 할 수있는 개념 증명 W8.1-app가 있습니다.ADAL : 사용자를 로그 아웃하려는 W8.1 앱

사용자가 로그인하여 내 리소스에 액세스 할 수 있도록 허용하는 부분이 있습니다. 그러나 사용자가 로그 아웃 할 수 있어야하고 다른 사용자가 같은 장치에 로그인 할 수 있어야합니다.

다른 질문이 SO 및 그 밖의 다른 질문과 관련하여 있지만 IOS 또는 WPF-app에서 발견되었습니다. (함께 사용하지 않을 경우에도)

private void ClearCookies() 
{ 
    const int INTERNET_OPTION_END_BROWSER_SESSION = 42; 
    InternetSetOption(IntPtr.Zero, INTERNET_OPTION_END_BROWSER_SESSION, IntPtr.Zero, 0); 
} 
[DllImport("wininet.dll", SetLastError = true)] 
private static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength); 

어느 작품 : 거기에, 그들은 <AuthenticationContext>.TokenCache.Clear()를 호출하고 사용하여 다음 호출하여 쿠키를 삭제 제안했다. 내가 PromptBehavior.Always를 사용하는 경우

AuthenticationResult ar = await authContext.AcquireTokenAsync("https://xxx", "yyyy", new Uri("ms-app://callback/") 
    , new AuthorizationParameters(PromptBehavior.Auto, true)); 

를 호출 할 때 , 사용자는 실제로 항상 자신을 인증해야하지만, 다음 캐시를 사용하지 않습니다.

tokencache를 무효화 할 수있는 방법에 대한 아이디어가 있으십니까? 사전에

덕분에

편집 :

authContext.TokenCache.Clear(); 
string requestUrl = "https://login.windows.net/common/oauth2/logout"; 
Task.Run(async() => 
{ 
    var client = new HttpClient(); 
    var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
    var response = await client.SendAsync(request); 
}); 

Edit2가

당신도 할 수 있습니다 vibronet에

감사를 해결, 나는이 작업을 수행하여 사용자가 로그 아웃 성공적으로 할 수 있었다 귀하의 응용 프로그램/임차인을위한 특정 URL을 "일반"을 임차인의 별칭으로 대체하여 사용하십시오 :

string tenantAlias = "TenantAlias.onmicrosoft.com"; 
string requestUrl = string.Format("https://login.windows.net/{0}/oauth2/logout", tenantAlias); 
+0

이것은 나를 위해 작동하지 않습니다. 네트워크 추적은 응답이 분명히 여기에서 실행되지 않는 JavaScript로 채워진 페이지임을 보여줍니다. 또한 ESTSAUTH와 같은 쿠키를 삭제하지 않고 응답 설정을 볼 수 있습니다. –

답변

2

실제 사용자 세션은 토큰 캐시 (ADAL 제어하에 있음)와 시스템에있을 수있는 세션 추적 쿠키 (ADAL이 제어하지 않음)의 두 가지 구성 요소로 결정됩니다.

지적했듯이 토큰 캐시 부분을 쉽게 관리 할 수 ​​있습니다. 그러나 쿠키를 삭제하기 위해 언급 한 논리는 Windows Store 응용 프로그램에서 작동하지 않습니다. 데스크톱 응용 프로그램의 경우 인증 과정에서 사용되는 쿠키 항아리가 응용 프로그램 자체 중 하나이므로 WPF에서 작동합니다. Windows Store에서 인증은 응용 프로그램 코드에서 분리되어 도달 할 수없는 고유 한 쿠키 항아리가있는 WebAuthenticationBroker을 사용합니다.

영구적 인 쿠키를 만들지 않는 가장 강력한 방법입니다 (예 : 인증 중에 '기억하기'를 클릭하지 않음). 그러나 그러한 쿠키로 끝나면 쿠키를 없애는 주된 방법은 동일한 WebAuthenticationBroker에서 로그 아웃하는 것입니다. 서버가 정리 작업을 처리합니다. 코드의 측면에서 :

string requestUrl = "https://login.windows.net/common/oauth2/logout"; 
Task.Run(async() => 
{ 
    try 
    { 
     await WebAuthenticationBroker.AuthenticateAsync(WebAuthenticationOptions.SilentMode, new Uri(requestUrl)); 
    } 
    catch (Exception) 
    { 
     // timeout. That's expected 
    } 
}); 
+0

그것이 작동하지 않으면,'AuthenticateAsync()'메쏘드는 NotImplementedException을 던집니다. 그러나, 당신이 지정한 URL에 간단한 HttpRequest을하는 트릭을 한 :) - 업데이트 된 원본 게시물 개봉 된 제안 및 솔루션 - 고마워 :) –

+0

아하 네 말이 맞아, 윈도우 8.1보다는 윈도우 8.1에 대한 답변을 썼습니다 (WAB는 자동 옵션을 지원하지 않습니다. 내 잘못이야!:-)하지만 기쁜 u는 그것을 작동 시켰어. – vibronet