带有MSAL的本机iOS应用程序需要第二次登录才能将Webview转到Sharepoint Online

时间:2019-06-10 16:11:33

标签: ios swift msal

我们已经能够成功地将MSAL iOS框架(0.4.2)添加到我们的应用程序中,但是由于正确的授权传递到了应用程序中的所有Web视图时遇到了问题。具体来说,我们使用MSAL Framework作为应用程序的初始登录点,然后尝试加载与我们的Azure AD(Sharepoint等)相关的其他网页。使用该框架成功成功登录后,这些网页上会显示另一个登录提示。这次,应用程序知道用户有时已在设备/应用程序上登录了Azure AD,并显示了用于登录的帐户名,但再次请求了密码。为什么没有任何理由使MSAL Framework似乎没有将Authorization部分传递给所有应用程序Web视图?

我们已将框架配置为将WKWebView用于本地浏览器而不是系统浏览器。以及使用框架中的默认WKWebView和应用程序中的“自定义”进行测试。我们还尝试传递具有共享WKProcessPool的自定义Web视图。

我们已经在Java / Kotlin Android应用程序以及适用于Android和iOS的Xamarin应用程序中使用了此功能。

我们尝试启用MSAL日志记录,但这样做会导致应用程序在关闭MSAL WKWebView时崩溃。

open func initMSAL() throws {

    guard ClientID != nil , ClientID != "" else {
        NSLog("No ClientID Provided. Please Provide a ClientID")
        return
    }

    var msalauthority: MSALAuthority? = nil;

    let url:URL = URL(string: AUTHORITY)!

    msalauthority = try MSALAADAuthority(url: url)
    let msalConfiguration = MSALPublicClientApplicationConfig(clientId: ClientID!, redirectUri: REDIRECTURI, authority: msalauthority)
    self.applicationContext = try MSALPublicClientApplication(configuration: msalConfiguration)
    MSALGlobalConfig.defaultWebviewType = .wkWebView
}


open func acquireTokenInteractively() {

    guard let applicationContext = self.applicationContext else { return }

    guard self.Scopes.count > 0 else {
        NSLog("No Scopes provided. Please provide Scopes.")
        return
    }

    let parameters = MSALInteractiveTokenParameters(scopes: self.Scopes)
    NSLog("WebView Value Type: %i", parameters.webviewType.rawValue );
    applicationContext.acquireToken(with: parameters) { (result, error) in

        if let error = error {
            NSLog("Could not acquire token: \(error)")
            self.delegate?.ProcessAuthResults(false, "Could not acquire token: \(error)")
            return
        }

        guard let result = result else {

            NSLog("Could not acquire token: No result returned")
            self.delegate?.ProcessAuthResults(false, "Could not acquire token: No result returned")
            return
        }

        self.AccessToken = result.accessToken
        NSLog("Access token is \(self.AccessToken)")
        self.delegate?.ProcessAuthResults(true, "Access Token received.")
    }
}

1 个答案:

答案 0 :(得分:0)

我们需要为MSAL使用正确的webviewtype以及您要打开以进行Cookie共享的链接,请查看此-Reuse access token from MSAL in web view