2015-08-24 92 views
6

我使用Azure Active Directory來保護我的Web API,並在Azure管理門戶中創建本機應用程序。這個本地應用程序基本上是一個MVC Web應用程序,我使用ADAL庫來獲取令牌並使用該令牌調用api。我曾經獲得的令牌代碼如下所示:使用ADAL庫註銷Azure Active Directory

AuthenticationContext ac = new AuthenticationContext(authority); 
AuthenticationResult ar = ac.AcquireToken(resourceID, clientID, redirectURI); 
string accessToken = ar.AccessToken; 

現在我需要註銷並切換到另一個用戶,但不知何故用戶憑證被系統記憶。我清除身份驗證上下文中的令牌緩存併發布註銷API請求,如下所示,其中***是我的租戶ID。

//Log out after api call 
ac.TokenCache.Clear(); 

string requestUrl = "https://login.windows.net/***/oauth2/logout"; 

var client = new HttpClient(); 
var request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
var response = await client.SendAsync(request); 

api調用成功,但註銷不起作用。 我應該怎樣做才能註銷並切換到其他用戶?

回答

8

我不認爲這會奏效。您需要將用戶重定向到註銷URL以便註銷才能正常工作。

這裏是如何創建一個註銷URI:

https://login.microsoftonline.com/{0}/oauth2/logout?post_logout_redirect_uri={1}

其中:

  • {0} - 您的Azure的活動目錄的完全合格的名字,例如: yourad.onmicrosoft.com或租戶ID。
  • {1} - 註銷完成後用戶必須重定向的應用程序的URL。這應該是正確的URL編碼。
+0

這正是我想要的,謝謝! –

+0

我試着在iOS ADAL中調用這個註銷,但它不足以防止帳戶更改的異常。使用ADALiOS和兩個不同帳戶的任何人都可以成功登錄/註銷? –

1

如果您的目標是爲其他用戶登錄,則不必嚴格按照其與Azure AD的會話登出第一位用戶。您可以在AcquireToken調用中傳遞PrompBehavior.Always,這樣可以保證用乾淨的憑證收集UX來提示用戶。 注意:如果要擦除應用程序中第一個用戶的所有跟蹤,可以保留緩存清理代碼。 ADAL允許您爲多個用戶保留令牌,因此如果您的應用程序是多用戶功能,這可能會非常有用 - 問題是,如果您這樣做,那麼在每個AcquireToken中,您都必須指定哪個用戶需要令牌for或ADAL將不知道哪一個返回。如果您一次不需要多個用戶,緩存清理+ PromptBehavior.Always仍然是最簡單的路徑。

+0

你能確認這一點目前有效嗎?我使用iOS ADAL庫和AD_PROMPT_ALWAYS請求。我無法登錄任何其他用戶,然後與我測試的第一個用戶:(ADAL錯誤:19,不同的用戶被認證,狀態:2)。 http://stackoverflow.com/questions/32312710/adal-for-ios-exception-with-a-different-user-sign-on –

1

您可以清除緩存做到這一點:

 CookieManager cookieManager = CookieManager.getInstance(); 
     cookieManager.removeAllCookie(); 
     CookieSyncManager.getInstance().sync(); 
     mAuthContext.getCache().removeAll(); 
+0

這是解決方案的一部分,他們已經改變了刪除令牌的最後部分緩存:'mAuthContext.getCache()。clear();'但這個解決方案實際上工作! – Vladimir