gpt4 book ai didi

iOS:ADAL 注销后自动登录

转载 作者:行者123 更新时间:2023-11-29 05:55:18 25 4
gpt4 key购买 nike

我在 iOS 应用程序中使用 ADAL v2.5.4 自动登录时遇到问题。

当用户想要登录 MSA 帐户时,我们会使用所需的参数调用 acquireTokenWithResource,并将提示行为设置为 AD_PROMPT_AUTO。在应用程序的第一次运行中,当用户成功登录时,用户会看到登录流程按预期工作的 Web View 。

在我的应用程序中单击“注销”时,我将删除具有我的应用程序 ClientID 的所有 token 。此时,我看到缓存中仍然存在一个 ClientID 为“foci-1”的 token 。此外,我正在清除应用程序的 Cookie 存储,以便 Web View 不会重用任何 Cookie。

当用户希望再次登录时会出现此问题。当再次触发相同的流程进行登录时,现在用户会自动登录。在日志中我看到“找到 1 个用于查询的 token ”。理想情况下,由于用户之前退出,因此应该再次提示他们输入凭据。

处理这种情况的正确方法是什么?是否应该以不同的方式处理注销?重新触发登录之前是否需要进行任何额外检查?在这种场景下promptBehavior有什么影响?

最佳答案

这是我用来从使用 ADAL 的应用执行“注销”的代码。

它调用注销端点以使服务器端的刷新 token 无效,并删除所有相关的 cookie 和钥匙串(keychain)条目。

fileprivate var safariModal = false
fileprivate var safariHostVC: UIViewController?

public func logout(presentOn viewController: UIViewController?, modal: Bool) {

let client = "xyzzy" // Your app client id here
let redirect = "youruri://somepath/" // Your redirect URI here

ADKeychainTokenCache.defaultKeychain().removeAll(forClientId: clientid, error: nil)

if let url = URL(string:"https://login.microsoftonline.com/common/oauth2/logout?post_logout_redirect_uri=\(redirect)") {
let safari = SFSafariViewController(url: url)
safari.toolbarItems = nil
safari.delegate = self
if #available(iOS 11.0, *) {
safari.dismissButtonStyle = .close
}

guard let vc = viewController else {
return
}

self.safariHostVC = vc
self.safariModal = modal
safari.modalPresentationStyle = .overFullScreen
safari.modalTransitionStyle = .coverVertical

if modal {
vc.present(safari, animated: true, completion: nil)
} else {
vc.navigationController?.pushViewController(safari, animated: true)
}

let cookieJar = HTTPCookieStorage.shared
guard let cookies = cookieJar.cookies else { return }
let cookiesArr = Array(cookies)
for cookie: HTTPCookie in cookiesArr {
if (cookie.name == "SignInStateCookie" || cookie.name == "ESTSAUTHPERSISTENT" || cookie.name == "ESTSAUTHLIGHT" || cookie.name == "ESTSAUTH" || cookie.name == "ESTSSC") {
cookieJar.deleteCookie(cookie)
}
}
}
}

您还需要实现 SFSafariViewControllerDelegate 函数

func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
guard let vc = self.safariHostVC else {
return
}
if self.safariModal {
vc.dismiss(animated: true, completion: nil)
} else {
vc.navigationController?.popViewController(animated: true)
}

self.safariHostVC = nil
}

关于iOS:ADAL 注销后自动登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55226617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com