如何从iOS ADAL身份验证LogOut?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从iOS ADAL身份验证LogOut?相关的知识,希望对你有一定的参考价值。

我已将ADAL库集成到我的ios应用程序中,并且工作正常。但现在我想退出ADAL。如何退出?

答案

使用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?

这是核选择。另一个更微妙的选择是清除缓存,然后在调用带有ADPromptBehavior参数的aquireToken时使用AD_PROMPT_ALWAYS值。当您使用AD_PROMPT_ALWAYS时,会向AAD发送一个标志,使其忽略cookie并向用户显示新的提示。这使得cookie保持原位,从技术上讲,用户实际上并未注销。对于用户来说,他们似乎已退出并且能够稍后再次登录。当他们再次登录时,如果他们愿意,他们可以选择不同的用户。

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

另一答案

这个快速的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)
    }
}
另一答案

Rich的优秀答案的更新。首先,接口已更改为最新的ADAL版本,您需要以这种方式访问​​令牌缓存:

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

为了清除cookie,我建议只删除重要的cookie而不是清除它们:

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安装上不起作用,并被迫删除cookie。)

以上是关于如何从iOS ADAL身份验证LogOut?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ADAL 从 UWP 中的 ADFS 获取 UserInfo

ADAL 和 MSAL 混淆

ADAL AcquireToken Windows 身份验证 UWP

如何配置 Azure AD 访问令牌的过期时间(使用 ADAL)?

使用 Phonegap/Cordova JS 应用程序和 MS ADAL JS。如何在真实手机中重定向 URI?

即使管理员已经同意,也会触发 ADAL 用户同意