iOS: автоматический вход ADAL после выхода

В этом случае компилятор C # не будет выбирать какой-либо конструктор и вместо этого будет ошибкой. Значение null является законным для нескольких доступных конструкторов, и для выбора одного из них недостаточно логики разлома, поэтому он вызывает ошибку.

Логика разрешения перегрузки компилятора C # представляет собой сложный процесс, но короткий (и по сути неполный) обзор того, как он работает, выглядит следующим образом

  • Соберите всех членов с данным именем
  • Отфильтруйте элементы с теми, у кого есть списки параметров, которые совместимы с предоставленными аргументами и с соответствующей доступностью
  • . Если остальные члены имеют более одного элемента, используйте логику разломов для выбора лучшие из них

. Полные данные перечислены в разделе 7.4 спецификации языка C #. И я уверен, что Эрик скоро отправится, чтобы дать гораздо более точное описание :)

0
задан Karthik Baskar 18 March 2019 в 17:08
поделиться

1 ответ

Это код, который я использую для «выхода» из приложения, использующего ADAL.

Он вызывает конечную точку выхода из системы для аннулирования токена обновления на стороне сервера и удаляет все соответствующие файлы cookie и записи цепочки для ключей.

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
}
0
ответ дан Paulw11 18 March 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: