Share via


Considerazioni sull'uso di Xamarin iOS con MSAL.NET

Quando si usa Microsoft Authentication Library per .NET (MSAL.NET) in Xamarin iOS, è necessario:

  • Eseguire l'override e implementare la OpenUrl funzione in AppDelegate.
  • Abilitare i gruppi keychain.
  • Abilitare la condivisione della cache dei token.
  • Abilitare l'accesso keychain.
  • Informazioni sui problemi noti con iOS 12 e iOS 13 e l'autenticazione.

Implementare OpenUrl

Eseguire l'override del OpenUrl metodo della FormsApplicationDelegate classe derivata e chiamare AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs. Ecco un esempio:

public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
{
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
    return true;
}

Eseguire anche le attività seguenti:

  • Definire uno schema URI di reindirizzamento.
  • Richiedere le autorizzazioni per l'app per chiamare un'altra app.
  • Disporre di un modulo specifico per l'URI di reindirizzamento.
  • Registrare un URI di reindirizzamento nella portale di Azure.

Abilitare l'accesso keychain

Per abilitare l'accesso keychain, assicurarsi che l'applicazione disponga di un gruppo di accesso keychain. È possibile impostare il gruppo di accesso keychain quando si crea l'applicazione usando l'API WithIosKeychainSecurityGroup() .

Per trarre vantaggio dalla cache e dall'accesso Single Sign-On (SSO), impostare il gruppo di accesso keychain sullo stesso valore in tutte le applicazioni.

Questo esempio di installazione usa MSAL 4.x:

var builder = PublicClientApplicationBuilder
     .Create(ClientId)
     .WithIosKeychainSecurityGroup("com.microsoft.adalcache")
     .Build();

Abilitare anche l'accesso keychain nel Entitlements.plist file. Usare il gruppo di accesso seguente o il proprio gruppo di accesso.

<dict>
  <key>keychain-access-groups</key>
  <array>
    <string>$(AppIdentifierPrefix)com.microsoft.adalcache</string>
  </array>
</dict>

Quando si usa l'APIWithIosKeychainSecurityGroup(), MSAL aggiunge automaticamente il gruppo di sicurezza alla fine dell'ID team dell'applicazione (AppIdentifierPrefix). MSAL aggiunge il gruppo di sicurezza perché quando si compila l'applicazione in Xcode, la stessa operazione verrà eseguita. Ecco perché i diritti nel Entitlements.plist file devono essere inclusi $(AppIdentifierPrefix) prima del gruppo di accesso keychain.

Per altre informazioni, vedere la documentazione relativa ai diritti iOS.

Risoluzione dei problemi di accesso keychain

Se viene visualizzato un messaggio di errore simile a "L'applicazione non è in grado di accedere al keychain iOS per l'editore dell'applicazione (TeamId è null)", significa che MSAL non è in grado di accedere a KeyChain. Si tratta di un problema di configurazione. Per risolvere i problemi, provare ad accedere a KeyChain autonomamente, ad esempio:

var queryRecord = new SecRecord(SecKind.GenericPassword)
{
    Service = "",
    Account = "SomeTeamId",
    Accessible = SecAccessible.Always
};

SecRecord match = SecKeyChain.QueryAsRecord(queryRecord, out SecStatusCode resultCode);

if (resultCode == SecStatusCode.ItemNotFound)
{
    SecKeyChain.Add(queryRecord);
    match = SecKeyChain.QueryAsRecord(queryRecord, out resultCode);
}

// Make sure that  resultCode == SecStatusCode.Success

Abilitare la condivisione della cache dei token tra applicazioni iOS

A partire da MSAL 2.x, è possibile specificare un gruppo di accesso keychain per rendere persistente la cache dei token in più applicazioni. Questa impostazione consente di condividere la cache dei token tra diverse applicazioni con lo stesso gruppo di accesso keychain. È possibile condividere la cache dei token tra applicazioni ADAL.NET , MSAL.NET applicazioni Xamarin.iOS e applicazioni iOS native sviluppate in ADAL.objc o MSAL.objc.

Condividendo la cache dei token, è possibile consentire l'accesso Single Sign-On (SSO) tra tutte le applicazioni che usano lo stesso gruppo di accesso keychain.

Per abilitare la condivisione della cache, usare il metodo per impostare il WithIosKeychainSecurityGroup() gruppo di accesso keychain sullo stesso valore in tutte le applicazioni che condividono la stessa cache. Il primo esempio di codice di questo articolo illustra come usare il metodo .

In precedenza in questo articolo si è appreso che MSAL viene aggiunto $(AppIdentifierPrefix) ogni volta che si usa l'API WithIosKeychainSecurityGroup() . MSAL aggiunge questo elemento perché l'ID AppIdentifierPrefix del team garantisce che solo le applicazioni create dallo stesso editore possano condividere l'accesso keychain.

Nota

La KeychainSecurityGroup proprietà è deprecata. Utilizzare in alternativa la proprietà iOSKeychainSecurityGroup. Il TeamId prefisso non è obbligatorio quando si usa iOSKeychainSecurityGroup.

Usare Microsoft Authenticator

L'applicazione può usare Microsoft Authenticator come broker per abilitare:

  • SSO: quando si abilita l'accesso SSO, gli utenti non devono accedere a ogni applicazione.
  • Identificazione dispositivo: usare l'identificazione del dispositivo per eseguire l'autenticazione accedendo al certificato del dispositivo. Questo certificato viene creato nel dispositivo quando viene aggiunto all'area di lavoro. L'applicazione sarà pronta se gli amministratori tenant abilitano l'accesso condizionale correlato ai dispositivi.
  • Verifica dell'identificazione dell'applicazione: quando un'applicazione chiama il broker, passa l'URL di reindirizzamento. Il broker verifica l'URL di reindirizzamento.

Per informazioni dettagliate su come abilitare un broker, vedere Usare Microsoft Authenticator o Microsoft Portale aziendale Intune nelle applicazioni Xamarin iOS e Android.

Problemi noti con iOS 12 e l'autenticazione

Microsoft ha rilasciato un avviso di sicurezza relativo a un'incompatibilità tra iOS 12 e alcuni tipi di autenticazione. L'incompatibilità interrompe gli accessi di social networking, WSFed e OIDC. L'avviso di sicurezza consente di comprendere come rimuovere le restrizioni di sicurezza ASP.NET dalle applicazioni per renderle compatibili con iOS 12.

Quando si sviluppano applicazioni MSAL.NET in Xamarin iOS, è possibile che venga visualizzato un ciclo infinito quando si tenta di accedere ai siti Web da iOS 12. Questo comportamento è simile a questo problema di ADAL in GitHub: ciclo infinito quando si tenta di accedere al sito Web da iOS 12 #1329.

È anche possibile che venga visualizzata un'interruzione ASP.NET'autenticazione OIDC core con iOS 12 Safari. Per altre informazioni, vedere questo problema del WebKit.

Problemi noti con iOS 13 e l'autenticazione

Se l'app richiede il supporto per l'accesso condizionale o l'autenticazione del certificato, abilitare l'app per comunicare con l'app broker Microsoft Authenticator. MSAL è quindi responsabile della gestione delle richieste e delle risposte tra l'applicazione e Microsoft Authenticator.

In iOS 13 Apple ha apportato una modifica dell'API di rilievo rimuovendo la possibilità dell'applicazione di leggere l'applicazione di origine quando riceve una risposta da un'applicazione esterna tramite schemi URL personalizzati.

Documentazione di Apple per gli stati UIApplicationOpenURLOptionsSourceApplicationKey :

Se la richiesta ha avuto origine da un'altra app appartenente al team, UIKit imposta il valore di questa chiave sull'ID dell'app. Se l'identificatore del team dell'app di origine è diverso dall'identificatore del team dell'app corrente, il valore della chiave è nil.

Questa modifica causa un'interruzione per MSAL perché si basa su UIApplication.SharedApplication.OpenUrl per verificare la comunicazione tra MSAL e l'app Microsoft Authenticator.

Inoltre, in iOS 13, lo sviluppatore deve fornire un controller di presentazione quando si usa ASWebAuthenticationSession.

L'app è interessata se si compila con Xcode 11 e si usa il broker iOS o ASWebAuthenticationSession.

In questi casi, usare MSAL.NET 4.4.0+ per abilitare l'autenticazione riuscita.

Requisiti aggiuntivi

  • Quando si usano le librerie MSAL più recenti, assicurarsi che Microsoft Authenticator versione 6.3.19+ sia installato nel dispositivo.

  • Quando si esegue l'aggiornamento a MSAL.NET 4.4.0+, aggiornare nel LSApplicationQueriesSchemesfile Info.plist e aggiungere msauthv3:

    <key>LSApplicationQueriesSchemes</key>
    <array>
         <string>msauthv2</string>
         <string>msauthv3</string>
    </array>
    

    L'aggiunta msauthv3 a Info.plist è necessaria per rilevare la presenza dell'app Microsoft Authenticator più recente nel dispositivo che supporta iOS 13.

Segnala un problema

Se si hanno domande o si vuole segnalare un problema riscontrato in MSAL.NET, aprire un problema nel microsoft-authentication-library-for-dotnet repository in GitHub.

Passaggi successivi

Per informazioni sulle proprietà per Xamarin iOS, vedere il paragrafo considerazioni specifiche di iOS del file di README.md dell'esempio seguente:

Esempio Piattaforma Descrizione
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin iOS, Android, piattaforma UWP (Universal Windows Platform) (UWP) Un'app Xamarin Forms che illustra come usare MSAL.NET per autenticare gli account aziendali o dell'istituto di istruzione e microsoft personali con Microsoft Identity Platform e accedere a Microsoft Graph con il token risultante.