首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从LogOut认证iOS?

如何从LogOut认证iOS?
EN

Stack Overflow用户
提问于 2015-03-13 10:30:26
回答 4查看 4.4K关注 0票数 7

我已经将ADAL库集成到我的iOS应用程序中,它运行得很好。但现在我想从ADAL那里退出。我怎么才能注销呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2015-03-13 16:21:34

当使用ADAL交互流时,有两个地方存储登录状态。第一个是完全由应用程序控制的令牌缓存。调用authContext.tokenCacheStore removeAllWithError:&error是一种清除所有缓存令牌并阻止ADAL在不启动浏览器的情况下登录的好方法。

但是,服务器也会在浏览器cookie中跟踪登录状态。服务器将记住用户已登录到服务器,直到cookie超时或被删除。当ADAL检查缓存而找不到合适的令牌时,它将启动webView。服务器将找到一个cookie,然后静默地登录用户。浏览器cookie在很大程度上是对ADAL隐藏的。ADAL库可能提供一个可以清除所有cookie的退出功能,但如果应用程序由于某种原因依赖于其他cookie,则会产生副作用。

有几种方法可以解决这个问题。如果您只想注销并且不介意清除所有webView cookie,那么在清除缓存之后,清除所有浏览器cookie,如下所示:

How to delete all cookies of UIWebView?

这是核选择。另一个更微妙的选择是清除缓存,然后在调用接受AD_PROMPT_ALWAYS参数的aquireToken时使用ADPromptBehavior值。当您使用AD_PROMPT_ALWAYS时,会向AAD发送一个标志,使其忽略cookies并向用户显示一个新的提示。这样就使得cookie在适当的位置,因此在技术上用户并没有被实际签署。在用户看来,他们似乎已被注销,并有能力在以后再次登录。当他们再次登录时,如果他们愿意的话,他们可以选择不同的用户。

这也是您处理与多个用户登录的方式。如果已经有用户登录,但希望添加另一个用户,请不要清除缓存,并在下一次调用acquireToken时传递acquireToken。服务器将显示一个新的登录提示并返回一个新的令牌。该令牌将存储在ADAL缓存中。通过调用acquireToken并传递userId来获得特定用户的令牌。

票数 10
EN

Stack Overflow用户

发布于 2017-11-10 21:49:25

这个迅捷的3代码适用于我(ADAL 2.5.1):

摧毁密钥存储库:

代码语言:javascript
复制
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)

清理饼干:

代码语言:javascript
复制
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)
    }
}
票数 6
EN

Stack Overflow用户

发布于 2016-07-13 20:02:58

里奇出色回答的最新消息。首先,随着最新的ADAL版本的发布,接口发生了变化,您需要以这种方式访问令牌缓存:

代码语言:javascript
复制
#import <ADAL/ADKeychainTokenCache.h>
[...]
[[ADKeychainTokenCache defaultKeychainCache] removeAllForClientId:ADFS_CLIENT_ID error:&error];

为了清除cookie,我建议只删除那些重要的饼干,而不是全部清除它们:

代码语言:javascript
复制
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。)

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29029948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档