Usare Microsoft Authenticator o Portale aziendale Intune nelle applicazioni Xamarin

In Android e iOS, broker come Microsoft Authenticator e Microsoft Portale aziendale Intune specifici di Android abilitano:

  • Single Sign-On (SSO): gli utenti non devono accedere a ogni applicazione.
  • Identificazione del dispositivo: il broker accede al certificato del dispositivo. Questo certificato viene creato nel dispositivo quando viene aggiunto all'area di lavoro.
  • Verifica dell'identificazione dell'applicazione: quando un'applicazione chiama il broker, passa l'URL di reindirizzamento. Il broker verifica l'URL.

Per abilitare una di queste funzionalità, usare il WithBroker() parametro quando si chiama il PublicClientApplicationBuilder.CreateApplication metodo . Il .WithBroker() parametro è impostato su true per impostazione predefinita.

La configurazione dell'autenticazione negoziata in Microsoft Authentication Library per .NET (MSAL.NET) varia in base alla piattaforma:

Autenticazione negoziata per iOS

Usare la procedura seguente per abilitare l'app Xamarin.iOS per comunicare con l'app Microsoft Authenticator . Se hai come destinazione iOS 13, prendi in considerazione la lettura della modifica dell'API che causa un'interruzione di Apple.

Passaggio 1: Abilitare il supporto broker

È necessario abilitare il supporto broker per singole istanze di PublicClientApplication. Il supporto è disabilitato per impostazione predefinita. Quando si crea PublicClientApplication tramite PublicClientApplicationBuilder, usare il WithBroker() parametro come illustrato nell'esempio seguente. Il WithBroker() parametro è impostato su true per impostazione predefinita.

var app = PublicClientApplicationBuilder
                .Create(ClientId)
                .WithBroker()
                .WithReplyUri(redirectUriOnIos) // $"msauth.{Bundle.Id}://auth" (see step 6 below)
                .Build();

Passaggio 2: Abilitare l'accesso keychain

Per abilitare l'accesso keychain, è necessario disporre di un gruppo di accesso keychain per l'applicazione. È possibile usare l'API WithIosKeychainSecurityGroup() per impostare il gruppo di accesso keychain quando si crea l'applicazione:

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

Per altre informazioni, vedere Abilitare l'accesso keychain.

Passaggio 3: Aggiornare AppDelegate per gestire il callback

Quando MSAL.NET chiama il broker, il broker richiama l'applicazione tramite il OpenUrl metodo della AppDelegate classe . Poiché MSAL attende la risposta del broker, l'applicazione deve cooperare per chiamare MSAL.NET indietro. Per abilitare questa cooperazione, aggiornare il file AppDelegate.cs per eseguire l'override del metodo seguente.

public override bool OpenUrl(UIApplication app, NSUrl url,
                             string sourceApplication,
                             NSObject annotation)
{
    if (AuthenticationContinuationHelper.IsBrokerResponse(sourceApplication))
    {
      AuthenticationContinuationHelper.SetBrokerContinuationEventArgs(url);
      return true;
    }

    else if (!AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url))
    {
         return false;
    }

    return true;
}

Questo metodo viene richiamato ogni volta che viene avviata l'applicazione. Viene usato come opportunità per elaborare la risposta dal broker e completare il processo di autenticazione che MSAL.NET avviato.

Passaggio 4: Impostare UIViewController()

Sempre nel file AppDelegate.cs impostare una finestra dell'oggetto. In genere non è necessario impostare la finestra dell'oggetto per Xamarin iOS, ma è necessaria una finestra dell'oggetto per inviare e ricevere risposte dal broker.

Per configurare la finestra dell'oggetto:

  1. Nel file AppDelegate.cs impostare su App.RootViewController un nuovo UIViewController()oggetto . Questa assegnazione garantisce che la chiamata al broker includa UIViewController. Se questa impostazione viene assegnata in modo non corretto, è possibile che venga visualizzato questo errore:

    "uiviewcontroller_required_for_ios_broker":"UIViewController is null, so MSAL.NET cannot invoke the iOS broker. See https://aka.ms/msal-net-ios-broker"

  2. AcquireTokenInteractive Nella chiamata usare .WithParentActivityOrWindow(App.RootViewController) e quindi passare il riferimento alla finestra dell'oggetto che verrà usata.

    In App.cs:

       public static object RootViewController { get; set; }
    

    In AppDelegate.cs:

       LoadApplication(new App());
       App.RootViewController = new UIViewController();
    

    AcquireToken Nella chiamata:

    result = await app.AcquireTokenInteractive(scopes)
                 .WithParentActivityOrWindow(App.RootViewController)
                 .ExecuteAsync();
    

Passaggio 5: Registrare uno schema URL

MSAL.NET usa gli URL per richiamare il broker e quindi restituire la risposta del broker all'app. Per completare il round trip, registrare uno schema URL per l'app nel file Info.plist .

Il CFBundleURLSchemes nome deve includere msauth. come prefisso. Seguire il prefisso con CFBundleURLName.

Nello schema BundleId URL identifica in modo univoco l'app: $"msauth.(BundleId)". Quindi, se BundleId è com.yourcompany.xforms, lo schema URL è msauth.com.yourcompany.xforms.

Nota

Questo schema URL diventa parte dell'URI di reindirizzamento che identifica in modo univoco l'app quando riceve la risposta dal broker.

 <key>CFBundleURLTypes</key>
    <array>
      <dict>
        <key>CFBundleTypeRole</key>
        <string>Editor</string>
        <key>CFBundleURLName</key>
        <string>com.yourcompany.xforms</string>
        <key>CFBundleURLSchemes</key>
        <array>
          <string>msauth.com.yourcompany.xforms</string>
        </array>
      </dict>
    </array>

Passaggio 6: Aggiungere l'identificatore del broker alla sezione LSApplicationQueriesSchemes

MSAL usa –canOpenURL: per verificare se il broker è installato nel dispositivo. In iOS 9 Apple ha bloccato gli schemi per cui un'applicazione può eseguire query.

Aggiungere msauthv2 alla LSApplicationQueriesSchemes sezione del file Info.plist , come nell'esempio seguente:

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

Passaggio 7: Aggiungere un URI di reindirizzamento alla registrazione dell'app

Suggerimento

I passaggi descritti in questo articolo possono variare leggermente in base al portale da cui si inizia.

Quando si usa il broker, l'URI di reindirizzamento ha un requisito aggiuntivo. L'URI di reindirizzamento deve avere il formato seguente:

$"msauth.{BundleId}://auth"

Ecco un esempio:

public static string redirectUriOnIos = "msauth.com.yourcompany.XForms://auth";

Si noti che l'URI di reindirizzamento corrisponde al CFBundleURLSchemes nome incluso nel file Info.plist .

Aggiungere l'URI di reindirizzamento alla registrazione dell'app. Per generare un URI di reindirizzamento formattato correttamente, usare Registrazioni app per generare l'URI di reindirizzamento negoziato dall'ID bundle.

Per generare l'URI di reindirizzamento:

  1. Accedere all'interfaccia di amministrazione di Microsoft Entra come almeno un'applicazione cloud Amministrazione istrator.

  2. Passare a Applicazioni> di identità>Registrazioni app.

  3. Cercare e selezionare l'applicazione.

  4. Selezionare Autenticazione>Aggiungi piattaforma>iOS/macOS

  5. Immettere l'ID bundle e quindi selezionare Configura.

    Copiare l'URI di reindirizzamento generato visualizzato nella casella di testo URI di reindirizzamento per l'inclusione nel codice:

    iOS platform settings with generated redirect URI

  6. Selezionare Fine per completare la generazione dell'URI di reindirizzamento.

Autenticazione negoziata per Android

Passaggio 1: Abilitare il supporto broker

Il supporto broker è abilitato in base alle propriePublicClientApplication attività. Per impostazione predefinita, è disabilitata. Usare il WithBroker() parametro (impostato su true per impostazione predefinita) durante la IPublicClientApplication creazione di tramite .PublicClientApplicationBuilder

var app = PublicClientApplicationBuilder
                .Create(ClientId)
                .WithBroker()
                .WithRedirectUri(redirectUriOnAndroid) // See step #4
                .Build();

Passaggio 2: Aggiornare l'attività principale per gestire il callback

Quando MSAL.NET chiama il broker, a sua volta il broker richiama l'applicazione con il OnActivityResult() metodo . Poiché MSAL attenderà la risposta dal broker, l'applicazione deve instradare il risultato a MSAL.NET.

Indirizzare il risultato al SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) metodo eseguendo l'override del OnActivityResult() metodo come illustrato di seguito:

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
{
   base.OnActivityResult(requestCode, resultCode, data);
   AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode, resultCode, data);
}

Questo metodo viene richiamato ogni volta che viene avviata l'applicazione broker e viene usato come opportunità per elaborare la risposta dal broker e completare il processo di autenticazione avviato da MSAL.NET.

Passaggio 3: Impostare un'attività

Per abilitare l'autenticazione negoziata, impostare un'attività in modo che MSAL possa inviare e ricevere la risposta da e verso il broker. A tale scopo, fornire l'attività (in genere il MainActivity) all'oggetto WithParentActivityOrWindow(object parent) padre.

Ad esempio, nella chiamata a AcquireTokenInteractive():

result = await app.AcquireTokenInteractive(scopes)
             .WithParentActivityOrWindow((Activity)context))
             .ExecuteAsync();

Passaggio 4: Aggiungere un URI di reindirizzamento alla registrazione dell'app

MSAL usa gli URL per richiamare il broker e quindi tornare all'app. Per completare il round trip, registrare un URI di reindirizzamento per l'app.

Il formato dell'URI di reindirizzamento per l'applicazione dipende dal certificato usato per firmare l'APK. Ad esempio:

msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=

L'ultima parte dell'URI, hgbUYHVBYUTvuvT&Y6tr554365466=, è la versione con codifica Base64 della firma con cui è firmato l'APK. Durante lo sviluppo dell'app in Visual Studio, se si esegue il debug del codice senza firmare l'APK con un certificato specifico, Visual Studio firma l'APK per scopi di debug. Quando Visual Studio firma automaticamente l'APK in questo modo, fornisce una firma univoca per il computer su cui si basa. Di conseguenza, ogni volta che si compila l'app in un computer diverso, è necessario aggiornare l'URI di reindirizzamento nel codice dell'applicazione e la registrazione dell'applicazione per l'autenticazione con MSAL.

Durante il debug, è possibile che si verifichi un'eccezione MSAL (o un messaggio di log) che indica che l'URI di reindirizzamento fornito non è corretto. Il messaggio di eccezione o di log indica anche l'URI di reindirizzamento in uso con il computer corrente in cui si esegue il debug. Puoi usare l'URI di reindirizzamento fornito per continuare a sviluppare l'app, purché aggiorni l'URI di reindirizzamento nel codice e aggiungi l'URI di reindirizzamento fornito alla registrazione dell'app.

Quando si è pronti per finalizzare il codice, aggiornare l'URI di reindirizzamento nel codice e la registrazione dell'applicazione per usare la firma del certificato con cui si firma l'APK.

In pratica, è consigliabile aggiungere un URI di reindirizzamento per ogni membro del team di sviluppo, oltre a un URI di reindirizzamento per la versione firmata di produzione dell'APK.

È possibile calcolare manualmente la firma, in modo analogo a come esegue MSAL:

   private string GetRedirectUriForBroker()
   {
      string packageName = Application.Context.PackageName;
      string signatureDigest = this.GetCurrentSignatureForPackage(packageName);
      if (!string.IsNullOrEmpty(signatureDigest))
      {
            return string.Format(CultureInfo.InvariantCulture, "{0}://{1}/{2}", RedirectUriScheme,
               packageName.ToLowerInvariant(), signatureDigest);
      }

      return string.Empty;
   }

   private string GetCurrentSignatureForPackage(string packageName)
   {
      Android.Content.PM.Signature signature = null;
      if (Build.VERSION.SdkInt >= BuildVersionCodes.Tiramisu)
      {
          var packageInfo = Application.Context.PackageManager.GetPackageInfo(packageName, PackageManager.PackageInfoFlags.Of((long)PackageInfoFlags.SigningCertificates));
          if (packageInfo.SigningInfo != null)
          {
              var signatures = packageInfo.SigningInfo.GetApkContentsSigners();
              if (signatures != null && signatures.Length > 0)
                  signature = signatures[0];
          }
      }
      else
      {
#pragma warning disable CS0618 // Type or member is obsolete
          var packageInfo = Application.Context.PackageManager.GetPackageInfo(packageName, PackageInfoFlags.Signatures);
          if (packageInfo != null && packageInfo.Signatures != null && packageInfo.Signatures.Count > 0)
              signature = packageInfo.Signatures[0];
#pragma warning restore CS0618 // Type or member is obsolete
      }
    
      if (signature != null)
      {
          // First available signature. Applications can be signed with multiple signatures.
          // The order of Signatures is not guaranteed.
          var md = MessageDigest.GetInstance("SHA");
          md.Update(signature.ToByteArray());
          return Convert.ToBase64String(md.Digest(), Base64FormattingOptions.None);
          // Server side needs to register all other tags. ADAL will
          // send one of them.
      }
   }

È anche possibile acquisire la firma per il pacchetto usando keytool con i comandi seguenti:

  • Windows:
    keytool.exe -list -v -keystore "%LocalAppData%\Xamarin\Mono for Android\debug.keystore" -alias androiddebugkey -storepass android -keypass android
    
  • macOS:
    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
    

Passaggio 5 (facoltativo): eseguire il fallback al browser di sistema

Se MSAL è configurato per l'uso del broker, ma il broker non è installato, MSAL eseguirà il fallback all'uso di una visualizzazione Web (un browser). MSAL tenterà di eseguire l'autenticazione usando il browser di sistema predefinito nel dispositivo, che ha esito negativo perché l'URI di reindirizzamento è configurato per il broker e il browser di sistema non sa come usarlo per tornare a MSAL. Per evitare l'errore, è possibile configurare un filtro finalità con l'URI di reindirizzamento del broker usato nel passaggio 4.

Modificare il manifesto dell'applicazione per aggiungere il filtro finalità:

<!-- NOTE the SLASH (required) that prefixes the signature value in the path attribute.
     The signature value is the Base64-encoded signature discussed above. -->
<intent-filter>
      <data android:scheme="msauth"
                    android:host="Package Name"
                    android:path="/Package Signature"/>

Ad esempio, se si dispone di un URI di reindirizzamento di msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=, il manifesto dovrebbe essere simile al frammento XML seguente.

La barra (/) davanti alla firma nel android:path valore è obbligatoria.

<!-- NOTE the SLASH (required) that prefixes the signature value in the path attribute.
     The signature value is the Base64-encoded signature discussed above. -->
<intent-filter>
      <data android:scheme="msauth"
                    android:host="com.microsoft.xforms.testApp"
                    android:path="/hgbUYHVBYUTvuvT&Y6tr554365466="/>

Per altre informazioni sulla configurazione dell'applicazione per il browser di sistema e sul supporto di Android 11, vedere Aggiornare il manifesto Android per il supporto del browser di sistema.

In alternativa, è possibile configurare MSAL per eseguire il fallback al browser incorporato, che non si basa su un URI di reindirizzamento:

.WithUseEmbeddedWebUi(true)

Suggerimenti per la risoluzione dei problemi relativi all'autenticazione negoziata android

Ecco alcuni suggerimenti per evitare problemi quando si implementa l'autenticazione negoziata in Android:

  • URI di reindirizzamento: aggiungere un URI di reindirizzamento alla registrazione dell'applicazione. Un URI di reindirizzamento mancante o errato è un problema comune rilevato dagli sviluppatori.

  • Versione broker: installare la versione minima richiesta delle app broker. Una di queste due app può essere usata per l'autenticazione negoziata in Android.

    • Portale aziendale Intune (versione 5.0.4689.0 o successiva)
    • Microsoft Authenticator (versione 6.2001.0140 o successiva).
  • Precedenza broker: MSAL comunica con il primo broker installato nel dispositivo quando vengono installati più broker.

    Esempio: se si installa prima Microsoft Authenticator e quindi si installa Portale aziendale Intune, l'autenticazione negoziata verrà eseguita solo in Microsoft Authenticator.

  • Log : se si verifica un problema con l'autenticazione negoziata, la visualizzazione dei log del broker potrebbe aiutare a diagnosticare la causa.

    • Ottenere i log di Microsoft Authenticator:

      1. Selezionare il pulsante di menu nell'angolo superiore destro dell'app.
      2. Selezionare Invia commenti e suggerimenti>con problemi?
      3. In Cosa si sta tentando di eseguire?, selezionare un'opzione e aggiungere una descrizione.
      4. Per inviare i log, selezionare la freccia nell'angolo superiore destro dell'app.

      Dopo aver inviato i log, viene visualizzata una finestra di dialogo con l'ID evento imprevisto. Registrare l'ID evento imprevisto e includerlo quando si richiede assistenza.

    • Ottenere i log di Portale aziendale Intune:

      1. Selezionare il pulsante di menu nell'angolo superiore sinistro dell'app.
      2. Selezionare Supporto per la posta elettronica della Guida>.
      3. Per inviare i log, selezionare Carica solo log.

      Dopo aver inviato i log, viene visualizzata una finestra di dialogo con l'ID evento imprevisto. Registrare l'ID evento imprevisto e includerlo quando si richiede assistenza.

Passaggi successivi

Informazioni sulle considerazioni sull'uso di piattaforma UWP (Universal Windows Platform) con MSAL.NET.