作者:专业长膘 | 来源:互联网 | 2023-05-18 10:40
我已将ADAL库集成到我的iOS应用程序中,并且工作正常.但现在我想退出ADAL.如何退出?
1> Rich Randall..:
使用ADAL交互流时,有两个地方存储登录状态.第一个是令牌缓存,它完全在应用程序的控制之下.调用[authContext.tokenCacheStore removeAllWithError:&error]是一种清除所有缓存令牌并阻止ADAL无需启动浏览器就可以登录的好方法.
但是,服务器也会在浏览器COOKIE中跟踪登录状态.服务器将记住用户已登录到服务器,直到COOKIE超时或被删除.当ADAL检查缓存并且找不到合适的令牌时,它将启动webView.服务器将找到一个COOKIE然后以静默方式签署用户.浏览器COOKIE在很大程度上隐藏在ADAL之外.ADAL库可能提供一个清除所有COOKIE的注销功能,但如果应用程序由于某种原因依赖于其他COOKIE,则会产生副作用.
有几种方法可以解决这个问题.如果您只是想退出并且不介意清除所有webView COOKIE,那么在清除缓存后,清除所有浏览器COOKIE,如下所述:
如何删除UIWebView的所有COOKIE?
这是核选择.另一个更微妙的选择是清除缓存,然后在调用带有ADPromptBehavior参数的aquireToken时使用AD_PROMPT_ALWAYS值.当您使用AD_PROMPT_ALWAYS时,会向AAD发送一个标志,使其忽略COOKIE并向用户显示新的提示.这使得COOKIE保持原位,从技术上讲,用户实际上并未注销.对于用户来说,他们似乎已退出并且能够稍后再次登录.当他们再次登录时,如果他们愿意,他们可以选择不同的用户.
这也是您处理多个用户登录的方式.如果您已经有用户登录但想要添加另一个用户,请不要清除缓存并在下次调用acquireToken时传递AD_PROMPT_ALWAYS.服务器将显示一个新的登录提示并返回一个新令牌.该令牌将存储在该ADAL缓存中.您可以通过调用acquireToken并传递userId来获取特定用户的令牌.
2> mevdev..:
这个快速的3代码对我有用(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)
}
}