我已经将ADAL库集成到我的iOS应用程序中,并且工作正常。但现在我想从ADAL注销。我怎样才能注销?如何从iOS ADAL身份验证中注销?
回答
使用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来获得特定用户的令牌。
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。)
这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)
}
}
- 1. JSF身份验证注销
- 2. ADAL iOS身份验证到Azure Web API
- 3. 从Windows身份验证注销
- 4. Servicestack身份验证获得身份验证/注销
- 5. 没有webview的ADAL身份验证
- 6. ASP.NET Forms身份验证 - 注销
- 7. ASP.NET Windows身份验证注销
- 8. 身份验证Ganglia gweb注销问题
- 9. 来自Notes身份验证的“注销”
- 10. ADAL身份验证错误多租户
- 11. ASP.NET Windows身份验证 - 注销
- 12. 如何从AccountManager注销我自己的身份验证器?
- 13. Azure活动目录身份验证库(ADAL)注销不起作用
- 14. 撤销Laravel身份验证
- 15. 从AAD身份验证中Azure Web App注销
- 16. 从Windows注销经过身份验证的ADFS,并以身份验证的不同用户身份登录
- 17. 使用设计HTTP身份验证时,如何手动注销?
- 18. 如何在使用.htaccess(和.htpasswd)身份验证时注销?
- 19. 如何使用表单身份验证注销jQuery或JavaScript?
- 20. 如何在iOS中实现用户注册和身份验证?
- 21. 工作灯LDAP身份验证注销从LDAPRealm
- 22. 从Windows身份验证应用程序注销
- 23. 从 - BASIC“Active Directory”强制注销“身份验证
- 24. AngularFire身份验证注册
- 25. 关于登录/注销,在asp.net中进行身份验证
- 26. 注销Laravel 5中的多个身份验证
- 27. Dart身份验证注册
- 28. 如何销毁会话(“注销”)与令牌身份验证的用户
- 29. 使用HTTP基本身份验证在Vaadin中注销
- 30. Firefox 4中的基本身份验证未注销
你尝试过这么远吗?请分享你的代码,你已经尝试过。 – Popeye 2015-03-13 11:33:23
@Popeye,我试过用这个代码[authContext。tokenCacheStore removeAllWithError:&error];我没有找到从他们的文档注销的代码。这里是我关注的链接https://github.com/AzureAD/azure-activedirectory-library-for-objc – 2015-03-13 12:39:12
请用你试过的代码更新你的问题 – Popeye 2015-03-13 12:40:00