Personalizzare browser e WebViews per iOS/macOS

Per l'autenticazione interattiva è necessario un Web browser. In iOS e macOS 10.15+, il Libreria di Autenticazione Microsoft (MSAL) usa il Web browser di sistema per impostazione predefinita (che potrebbe apparire sopra l'app) per eseguire l'autenticazione interattiva per consentire agli utenti di accedere. L'uso del browser di sistema offre il vantaggio di condividere lo stato dell'accesso Single Sign-On (SSO) con altre applicazioni e con applicazioni Web.

È possibile modificare l'esperienza personalizzando la configurazione con altre opzioni per la visualizzazione del contenuto Web, ad esempio:

Solo per iOS:

Per iOS e macOS:

MSAL per macOS supporta WKWebView solo nelle versioni precedenti del sistema operativo. ASWebAuthenticationSession è supportato solo in macOS 10.15 e versioni successive.

Browser di sistema

Per iOS, ASWebAuthenticationSession, SFAuthenticationSessione SFSafariViewController sono considerati browser di sistema. Per macOS, è disponibile solo ASWebAuthenticationSession . In generale, i browser di sistema condividono cookie e altri dati del sito Web con l'applicazione browser Safari.

Per impostazione predefinita, MSAL rileverà dinamicamente la versione di iOS e selezionerà il browser di sistema consigliato disponibile in tale versione. In iOS 12+ sarà ASWebAuthenticationSession.

Configurazione predefinita per iOS

Versione navigatore web
iOS 12+ ASWebAuthenticationSession
iOS 11 SFAuthenticationSession
iOS 10 SFSafariViewController

Configurazione predefinita per macOS

Versione navigatore web
macOS 10.15+ ASWebAuthenticationSession
altre versioni WKWebView

Gli sviluppatori possono anche selezionare un browser di sistema diverso per le app MSAL:

  • SFAuthenticationSession è la versione iOS 11 di ASWebAuthenticationSession.
  • SFSafariViewController è più generico e fornisce un'interfaccia per l'esplorazione del Web e può essere usata anche a scopo di accesso. In iOS 9 e 10 i cookie e altri dati del sito Web vengono condivisi con Safari, ma non in iOS 11 e versioni successive.

browser integrato nell'app

WKWebView è un browser in-app che visualizza il contenuto Web. Non condivide i cookie o i dati del sito Web con altre istanze di WKWebView o con il browser Safari. WKWebView è un browser multipiattaforma disponibile sia per iOS che per macOS.

Il browser usato influisce sull'esperienza SSO a causa del modo in cui condividono i cookie. Le tabelle seguenti riepilogano le esperienze SSO per browser.

Tecnologia Tipo di browser Disponibilità di iOS Disponibilità di macOS Condivide cookie e altri dati Disponibilità MSAL SSO (Autenticazione Unica)
ASWebAuthenticationSession System iOS 12 e versioni successive macOS 10.15 e versioni successive iOS e macOS 10.15+ con istanze di Safari
SFAuthenticationSession System iOS11 e versioni successive N/A Solo per iOS con istanze di Safari
SFSafariViewController System iOS11 e versioni successive N/A No Solo per iOS No**
SFSafariViewController System iOS10 N/A Solo per iOS con istanze di Safari
WKWebView In-app iOS 8 e versioni successive macOS 10.10 e versioni successive No iOS e macOS No**

** Per il funzionamento dell'accesso Single Sign-On, i token devono essere condivisi tra le app. Ciò richiede una cache dei token o un'applicazione broker, ad esempio Microsoft Authenticator per iOS.

Modificare il browser predefinito per la richiesta

È possibile usare un browser in-app o un browser di sistema specifico a seconda dei requisiti dell'esperienza utente modificando la proprietà seguente in MSALWebviewParameters:

@property (nonatomic) MSALWebviewType webviewType;

Modifica per richiesta interattiva

Ogni richiesta può essere configurata per eseguire l'override del browser predefinito modificando la MSALInteractiveTokenParameters.webviewParameters.webviewType proprietà prima di passarla all'API acquireTokenWithParameters:completionBlock: .

Inoltre, MSAL consente di passare un WKWebView personalizzato impostando la proprietà MSALInteractiveTokenParameters.webviewParameters.customWebView.

Per esempio:

Objective-C

UIViewController *myParentController = ...;
WKWebView *myCustomWebView = ...;
MSALWebviewParameters *webViewParameters = [[MSALWebviewParameters alloc] initWithAuthPresentationViewController:myParentController];
webViewParameters.webviewType = MSALWebviewTypeWKWebView;
webViewParameters.customWebview = myCustomWebView;
MSALInteractiveTokenParameters *interactiveParameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"myscope"] webviewParameters:webViewParameters];

[app acquireTokenWithParameters:interactiveParameters completionBlock:completionBlock];

Swift

let myParentController: UIViewController = ...
let myCustomWebView: WKWebView = ...
let webViewParameters = MSALWebviewParameters(authPresentationViewController: myParentController)
webViewParameters.webviewType = MSALWebviewType.wkWebView
webViewParameters.customWebview = myCustomWebView
let interactiveParameters = MSALInteractiveTokenParameters(scopes: ["myscope"], webviewParameters: webViewParameters)

app.acquireToken(with: interactiveParameters, completionBlock: completionBlock)

Se si usa una visualizzazione Web personalizzata, le notifiche vengono usate per indicare lo stato del contenuto Web visualizzato, ad esempio:

/*! Fired at the start of a resource load in the webview. The URL of the load, if available, will be in the @"url" key in the userInfo dictionary */
extern NSString *MSALWebAuthDidStartLoadNotification;

/*! Fired when a resource finishes loading in the webview. */
extern NSString *MSALWebAuthDidFinishLoadNotification;

/*! Fired when web authentication fails due to reasons originating from the network. Look at the @"error" key in the userInfo dictionary for more details.*/
extern NSString *MSALWebAuthDidFailNotification;

/*! Fired when authentication finishes */
extern NSString *MSALWebAuthDidCompleteNotification;

/*! Fired before ADAL invokes the broker app */
extern NSString *MSALWebAuthWillSwitchToBrokerApp;

Options

Tutti i tipi di Web browser supportati da MSAL vengono dichiarati nell'enumerazione MSALWebviewType

typedef NS_ENUM(NSInteger, MSALWebviewType)
{
    /**
     For iOS 11 and up, uses AuthenticationSession (ASWebAuthenticationSession or SFAuthenticationSession).
     For older versions, with AuthenticationSession not being available, uses SafariViewController.
     For macOS 10.15 and above uses ASWebAuthenticationSession
     For older macOS versions uses WKWebView
     */
    MSALWebviewTypeDefault,

    /** Use ASWebAuthenticationSession where available.
     On older iOS versions uses SFAuthenticationSession
     Doesn't allow any other webview type, so if either of these are not present, fails the request*/
    MSALWebviewTypeAuthenticationSession,

#if TARGET_OS_IPHONE

    /** Use SFSafariViewController for all versions. */
    MSALWebviewTypeSafariViewController,

#endif
    /** Use WKWebView */
    MSALWebviewTypeWKWebView,
};

Passaggi successivi

Altre informazioni sui flussi di autenticazione e sugli scenari dell'applicazione