2015-03-13 48 views
4

我已經將ADAL庫集成到我的iOS應用程序中,並且工作正常。但現在我想從ADAL註銷。我怎樣才能註銷?如何從iOS ADAL身份驗證中註銷?

+0

你嘗試過這麼遠嗎?請分享你的代碼,你已經嘗試過。 – Popeye 2015-03-13 11:33:23

+1

@Popeye,我試過用這個代碼[authContext。tokenCacheStore removeAllWithError:&error];我沒有找到從他們的文檔註銷的代碼。這裏是我關注的鏈接https://github.com/AzureAD/azure-activedirectory-library-for-objc – 2015-03-13 12:39:12

+0

請用你試過的代碼更新你的問題 – Popeye 2015-03-13 12:40:00

回答

8

使用ADAL交互流時,有兩個地方可以存儲登錄狀態。第一個是完全在應用程序控制下的令牌緩存。調用[authContext.tokenCacheStore removeAllWithError:&錯誤]是清除所有緩存的令牌並停止ADAL無法啓動而無需啓動瀏覽器的好方法。

但是,登錄狀態也由服務器在瀏覽器cookie中跟蹤。服務器將記住用戶登錄到服務器,直到cookie超時或被刪除。當ADAL檢查緩存並且沒有找到合適的令牌時,它將啓動webView。服務器會找到一個cookie,然後悄悄地簽署該用戶。瀏覽器cookie在很大程度上隱藏在ADAL中。 ADAL庫可能會提供一個清除所有cookie的註銷函數,但如果應用程序因某些原因依賴於其他cookie,則會產生副作用。

有幾種解決方法。如果你只是想退出,你不介意清除所有webView的Cookie,然後清除緩存後,清除瀏覽器的cookies如下所述:

How to delete all cookies of UIWebView?

這是核選擇。另一個更微妙的選項是清除緩存,然後在調用aquireToken的AD_PROMPT_ALWAYS值中使用ADPromptBehavior參數。當您使用AD_PROMPT_ALWAYS時,會向AAD發送一個標誌,使其忽略Cookie並向用戶提供新的提示。這就使得cookies在技術上保持原樣,用戶並未實際登出。對用戶來說,看起來他們已經退出並且有能力稍後再次登錄。當他們再次登錄時,如果他們願意,他們可以選擇不同的用戶。

這也是您處理多用戶登錄的方式。如果您已經有用戶登錄,但想要添加另一個用戶,請不要清除緩存,並在下次調用acquireToken時傳遞AD_PROMPT_ALWAYS。服務器將顯示新的登錄提示並返回新的令牌。該令牌將存儲在該ADAL緩存中。您通過調用acquireToken並傳遞一個userId來獲得特定用戶的令牌。

3

Rich的優秀答案的更新。首先,界面與最新ADAL發佈更改,您需要訪問令牌緩存是這樣的:

#import <ADAL/ADKeychainTokenCache.h> 
[...] 
[[ADKeychainTokenCache defaultKeychainCache] removeAllForClientId:ADFS_CLIENT_ID error:&error]; 

並清除餅乾,我建議剛刪除的那些事,而不是清除它們所有的:

NSHTTPCookieStorage *cookieJar = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
for (NSHTTPCookie *cookie in [cookieJar cookies]) { 
    if ([cookie.name isEqualToString:@"MSISAuth"] || 
     [cookie.name isEqualToString:@"MSISAuthenticated"] || 
     [cookie.name isEqualToString:@"MSISLoopDetectionCookie"]) { 
     [cookieJar deleteCookie:cookie]; 
    } 
} 

(我發現AD_PROMPT_ALWAYS沒有工作在舊ADFS設施和被迫刪除cookies。)

1

這3 SWIFT代碼爲我工作(ADAL 2.5.1):

銷燬密鑰庫:

guard let clientId = getAuthConfig().clientId else { 
      // freak out 
      print("Auth.logout: I freaked out getting the client ID ") 
      return 
     } 
     ADKeychainTokenCache.defaultKeychain().removeAll(forClientId: clientId, error: nil) 

疏通餅乾:

let cookieJar = HTTPCookieStorage.shared 
guard let cookies = cookieJar.cookies else { return } 
let cookiesArr = Array(cookies) 
for cookie: HTTPCookie in cookiesArr { 
    print(cookie.name) 
    if (cookie.name == "SignInStateCookie" || cookie.name == "ESTSAUTHPERSISTENT" || cookie.name == "ESTSAUTHLIGHT" || cookie.name == "ESTSAUTH" || cookie.name == "ESTSSC") { 
     cookieJar.deleteCookie(cookie) 
    } 
} 
相關問題