2015-03-13 47 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) 
    } 
} 
相关问题