2014-11-21 28 views
2

我有一個概念證明W8.1-app,它允許使用ADAL庫對Azure Active Directory進行用戶身份驗證。ADAL:W8.1應用程序試圖將用戶註銷

我已經得到允許用戶登錄和訪問我的資源工作的部分。但是,它應該能夠允許用戶註銷,並允許其他用戶在同一臺​​設備上登錄。

我發現了關於SO和其他地方的其他問題,關於類似的問題,但在IOS或WPF應用程序中。在那裏,他們建議調用<AuthenticationContext>.TokenCache.Clear()並通過使用以下調用清理餅乾:

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

無論作品(甚至沒有一起使用時)。 當調用

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

如果我使用PromptBehavior.Always,用戶必須始終確實驗證自己,但它不使用緩存即可。

關於如何使令牌緩存無效的任何想法?

在此先感謝

編輯:解決

感謝vibronet,我能夠這樣做是爲了成功地註銷用戶:

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

你也可以使用您的應用程序/租戶特定的網址,將「common」替換爲您的租戶的別名,如下所示:

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

這對我不起作用。網絡跟蹤顯示響應是一個充滿JavaScript的頁面,顯然不會在這裏運行,另外我可以看到響應設置,而不是像ESTSAUTH那樣清除cookie。 – 2016-05-19 19:14:01

回答

2

實際的用戶會話由兩個不同的組件決定:令牌緩存(在ADAL控制下)和任何會跟蹤系統中可能存在的cookie(不受ADAL控制)。

正如您指出的那樣,您可以輕鬆地處理令牌緩存部分。但是,您提到的用於清除Cookie的邏輯不適用於Windows應用商店應用程序。它適用於WPF,因爲對於桌面應用程序,身份驗證期間使用的cookie jar是應用程序本身的一個。在Windows應用商店中,身份驗證與WebAuthenticationBroker一致,後者擁有自己的Cookie jar,這是與應用程序代碼分開且無法訪問的。

最強大的方法是不創建任何持久性cookie(例如,在驗證過程中不要點擊「記住我」)。然而,如果你最終得到這樣一個cookie,擺脫它的主要方式是觸發從相同的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。然而,做一個簡單的HttpRequest到您指定的url做了訣竅:) - 更新了原始帖子,包括您的建議和解決方案 - 謝謝:) – 2014-11-24 12:36:43

+0

argh您是對的,我爲windows 8.1寫了答案而不是Windows PHONE 8.1其WAB不支持無聲選項)。我的錯!:-)但很高興你的工作 – vibronet 2014-11-24 16:45:20