Utiliser Microsoft Authenticator ou le Portail d’entreprise Intune sur des applications Xamarin

Sur Android et iOS, des répartiteurs tels que Microsoft Authenticator et le Portail d’entreprise Microsoft Intune pour Android permettent d’effectuer les opérations suivantes :

  • Authentification unique (SSO) : les utilisateurs n’ont pas besoin de se connecter à chaque application.
  • Identification de l’appareil : le répartiteur accède au certificat de l’appareil. Ce certificat est créé sur l’appareil quand celui-ci est joint à l’espace de travail.
  • Vérification de l’identification de l’application : quand une application appelle le répartiteur, elle transmet son URL de redirection. Le répartiteur vérifie alors l’URL.

Pour activer l’une de ces fonctionnalités, utilisez le paramètre WithBroker() lorsque vous appelez la méthode PublicClientApplicationBuilder.CreateApplication. Par défaut, le paramètre .WithBroker() est défini sur true.

La configuration de l’authentification répartie dans la bibliothèque d’authentification Microsoft pour .NET (MSAL.NET) varie selon la plateforme :

Authentification répartie pour iOS

Suivez les étapes ci-dessous pour permettre à votre application Xamarin.iOS de communiquer avec l’application Microsoft Authenticator. Si vous ciblez iOS 13, vous pouvez vous renseigner sur le changement cassant d’API d’Apple.

Étape 1 : Activer la prise en charge du répartiteur

Vous devez activer la prise en charge du répartiteur pour chaque instance de PublicClientApplication. La prise en charge est désactivée par défaut. Si vous créez PublicClientApplication avec PublicClientApplicationBuilder, utilisez le paramètre WithBroker() comme dans l’exemple suivant. Par défaut, le paramètre WithBroker() est défini sur true.

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

Étape 2 : Activer l’accès au trousseau

Pour activer l’accès au trousseau, vous devez avoir défini un groupe d’accès au trousseau pour votre application. Vous pouvez utiliser l’API WithIosKeychainSecurityGroup() pour définir votre groupe d’accès au trousseau lorsque vous créez votre application :

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

Pour plus d'informations, consultez Activer l’accès au trousseau.

Étape 3 : Mettre à jour AppDelegate pour gérer le rappel

Quand MSAL.NET appelle le répartiteur, ce dernier rappelle votre application via la méthode OpenUrl de la classe AppDelegate. Comme MSAL attend la réponse du répartiteur, votre application doit coopérer pour rappeler MSAL.NET. Pour permettre cette coopération, mettez à jour le fichier AppDelegate.cs pour remplacer la méthode suivante.

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;
}

Cette méthode est appelée à chaque démarrage de l’application. Elle permet de traiter la réponse du répartiteur et d’accomplir le processus d’authentification lancé par MSAL.NET.

Étape 4 : Définir UIViewController()

Toujours dans le fichier AppDelegate.cs, définissez une fenêtre d’objet. Vous n’avez généralement pas besoin de définir la fenêtre d’objet pour Xamarin iOS, mais vous avez besoin d’une fenêtre d’objet pour envoyer des réponses au répartiteur et recevoir des réponses.

Pour configurer la fenêtre d’objet :

  1. Dans le fichier AppDelegate.cs, définissez App.RootViewController sur un nouveau UIViewController(). Cette affectation garantit que l’appel au répartiteur comprend UIViewController. Si ce paramètre n’est pas correctement affecté, vous risquez de recevoir cette erreur :

    "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. Dans l’appel AcquireTokenInteractive, utilisez .WithParentActivityOrWindow(App.RootViewController), puis passez la référence à la fenêtre d’objet que vous allez utiliser.

    Dans App.cs :

       public static object RootViewController { get; set; }
    

    Dans AppDelegate.cs :

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

    Dans l’appel AcquireToken :

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

Étape 5 : Inscrire un schéma d’URL

MSAL.NET utilise des URL pour appeler le répartiteur, avant de retourner la réponse du répartiteur à votre application. Pour effectuer l’aller-retour, inscrivez un schéma d’URL pour votre application dans le fichier Info.plist.

Le nom CFBundleURLSchemes doit inclure le préfixe msauth., suivi de CFBundleURLName.

Dans le schéma d’URL, BundleId identifie de manière unique l’application : $"msauth.(BundleId)". Par conséquent, si BundleId est com.yourcompany.xforms, le schéma d’URL est msauth.com.yourcompany.xforms.

Notes

Ce schéma d’URL fait alors partie de l’URI de redirection qui identifie de manière unique votre application lorsqu’elle reçoit la réponse du répartiteur.

 <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>

Étape 6 : Ajouter l’identificateur du répartiteur à la section LSApplicationQueriesSchemes

MSAL utilise –canOpenURL: pour vérifier si le répartiteur est installé sur l’appareil. Dans iOS 9, Apple a verrouillé les schémas qu’une application peut interroger.

Ajoutez msauthv2 à la section LSApplicationQueriesSchemes du fichier Info.plist, comme dans l’exemple suivant :

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

Étape 7 : Ajouter un URI de redirection à l’inscription de votre application

Conseil

Les étapes décrites dans cet article peuvent varier légèrement en fonction du portail de départ.

Si vous utilisez le répartiteur, votre URI de redirection doit remplir une exigence supplémentaire. Le format de l'URI de redirection doit être le suivant :

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

Voici un exemple :

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

Vous remarquerez que l’URI de redirection correspond au nom CFBundleURLSchemes que vous avez indiqué dans le fichier Info.plist.

Ajoutez l’URI de redirection à l’inscription de l’application. Pour générer un URI de redirection correctement mis en forme, utilisez les inscriptions d’applications pour générer l’URI de redirection répartie à partir de l’ID d’offre groupée.

Pour générer l’URI de redirection :

  1. Connectez-vous au centre d’administration de Microsoft Entra au minimum en tant qu’Administrateur d’application cloud.

  2. Accédez à Identité>Applications>Inscriptions d’applications.

  3. Recherchez votre application et sélectionnez-la.

  4. Sélectionnez Authentification>Ajouter une plateforme>iOS / macOS.

  5. Entrez votre ID d’offre groupée, puis sélectionnez Configurer.

    Copiez l’URI de redirection généré qui apparaît dans la zone de texte URI de redirection à inclure dans votre code :

    iOS platform settings with generated redirect URI

  6. Sélectionnez Terminé pour terminer la génération de l’URI de redirection.

Authentification répartie pour Android

Étape 1 : Activer la prise en charge du répartiteur

La prise en charge du répartiteur est activée par PublicClientApplication. Elle est désactivée par défaut. Utilisez le paramètre WithBroker() (défini sur true par défaut) lors de la création de IPublicClientApplication via PublicClientApplicationBuilder.

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

Étape 2 : Mettre à jour l’activité principale pour gérer le rappel

Quand MSAL.NET appelle le répartiteur, ce dernier rappelle à son tour votre application avec la méthode OnActivityResult(). Étant donné que MSAL attend la réponse du répartiteur, votre application doit router le résultat vers MSAL.NET.

Routez le résultat vers la méthode SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) en substituant la méthode OnActivityResult() comme indiqué ici :

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

Cette méthode est appelée chaque fois que l’application de répartiteur est lancée et permet de traiter la réponse du répartiteur et d’accomplir le processus d’authentification démarré par MSAL.NET.

Étape 3 : Définir une activité

Pour activer l’authentification répartie, définissez une activité afin que MSAL puisse envoyer la réponse au répartiteur et recevoir sa réponse. Pour ce faire, fournissez l’activité (généralement, MainActivity) à WithParentActivityOrWindow(object parent), l’objet parent.

Par exemple, dans l’appel à AcquireTokenInteractive() :

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

Étape 4 : Ajouter un URI de redirection à l’inscription de votre application

MSAL utilise des URL pour appeler le répartiteur, avant de retourner à votre application. Pour effectuer cet aller-retour, inscrivez un URI de redirection pour votre application.

Le format de l’URI de redirection pour votre application dépend du certificat utilisé pour signer l’APK. Par exemple :

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

La dernière partie de l’URI, hgbUYHVBYUTvuvT&Y6tr554365466=, correspond à la version encodée au format Base64 de la signature utilisée pour l’APK. Lors du développement de votre application dans Visual Studio, si vous déboguez votre code sans signer l’APK avec un certificat spécifique, Visual Studio signe l’APK pour vous à des fins de débogage. Lorsque Visual Studio signe l’APK pour vous de cette manière, il lui donne une signature unique pour l’ordinateur sur lequel il est basé. Par conséquent, chaque fois que vous créez votre application sur un autre ordinateur, vous devez mettre à jour l’URI de redirection dans le code et l’inscription de l’application afin de vous authentifier auprès de MSAL.

Lors du débogage, vous pouvez rencontrer une exception MSAL (ou un message du journal) indiquant que l’URI de redirection fourni est incorrect. Le message d’exception ou de journal indique également l’URI de redirection que vous devez utiliser avec l’ordinateur sur lequel vous effectuez le débogage. Vous pouvez utiliser l’URI de redirection fourni pour poursuivre le développement de votre application à condition de mettre à jour l’URI de redirection dans le code et d’ajouter l’URI de redirection fourni dans l’inscription de l’application.

Une fois que vous êtes prêt à finaliser votre code, mettez à jour l’URI de redirection dans le code et l’inscription de l’application afin d’utiliser la signature du certificat avec laquelle vous signez l’APK.

Dans la pratique, cela signifie que vous devez envisager d’ajouter un URI de redirection pour chaque membre de votre équipe de développement, plus un URI de redirection pour la version signée de production de l’APK.

Vous pouvez calculer cette signature vous-même, d’une façon similaire à celle utilisée par 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.
      }
   }

Vous avez également la possibilité d’acquérir la signature pour votre package en utilisant keytool avec les commandes suivantes :

  • 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
    

Étape 5 (facultatif) : Revenir au navigateur système

Si MSAL est configuré pour utiliser le répartiteur mais que celui-ci n’est pas installé, MSAL revient à l’utilisation d’une vue web (un navigateur). MSAL essaie de s’authentifier à l’aide du navigateur système par défaut sur l’appareil, ce qui échoue car l’URI de redirection est configuré pour le répartiteur et que le navigateur système ne sait pas comment l’utiliser pour revenir à MSAL. Pour éviter cet échec, vous pouvez configurer un filtre d’intention avec l’URI de redirection du répartiteur que vous avez utilisé à l’étape 4.

Modifiez le manifeste de votre application pour ajouter ce filtre d’intention :

<!-- 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"/>

Par exemple, si vous avez un URI de redirection msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=, votre manifeste doit ressembler à l’extrait de code XML suivant.

La barre oblique (/) devant la signature dans la valeur android:path est requise.

<!-- 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="/>

Pour plus d’informations sur la configuration de votre application pour la prise en charge du navigateur système et d’Android 11, consultez Mettre à jour le manifeste Android pour la prise en charge du navigateur système.

Comme alternative, vous pouvez configurer MSAL pour revenir au navigateur incorporé, qui ne repose pas sur un URI de redirection :

.WithUseEmbeddedWebUi(true)

Conseils de dépannage pour l’authentification répartie Android

Voici quelques conseils pour éviter les problèmes quand vous implémentez l’authentification répartie sur Android :

  • URI de redirection : ajoutez un URI de redirection dans l’inscription de votre application. Un URI de redirection manquant ou incorrect est un problème rencontré couramment par les développeurs.

  • Broker version (Version du répartiteur) – Installez la version minimale requise des applications de répartiteur. L’une de ces deux applications peut être utilisée pour l’authentification répartie sur Android.

  • Broker precedence (Priorité du répartiteur) – MSAL communique avec le premier répartiteur installé sur l’appareil lorsque plusieurs répartiteurs sont installés.

    Exemple : Si vous commencez par installer Microsoft Authenticator, puis installez le portail d’entreprise Intune, l’authentification répartie se produit uniquement sur Microsoft Authenticator.

  • Logs (Journaux) – Si vous rencontrez un problème avec l’authentification répartie, l’affichage des journaux du répartiteur peut vous aider à diagnostiquer la cause.

    • Obtenez les journaux de Microsoft Authenticator :

      1. Sélectionnez le bouton de menu en haut à droite de l’application.
      2. Sélectionnez Envoyer des commentaires>Des difficultés ? .
      3. Sous Quelle tâche essayez-vous d’effectuer ? , sélectionnez une option, puis ajoutez une description.
      4. Pour envoyer les journaux, sélectionnez la flèche dans le coin supérieur droit de l’application.

      Une fois que vous avez envoyé les journaux, une boîte de dialogue affiche l’ID de l’incident. Enregistrez l’ID de l’incident et mentionnez-le lorsque vous demandez de l’aide.

    • Obtenez les journaux du portail d’entreprise Intune :

      1. Sélectionnez le bouton de menu en haut à gauche de l’application.
      2. Sélectionnez Aide>Support technique par e-mail.
      3. Pour envoyer les journaux, sélectionnez Charger les journaux uniquement.

      Une fois que vous avez envoyé les journaux, une boîte de dialogue affiche l’ID de l’incident. Enregistrez l’ID de l’incident et mentionnez-le lorsque vous demandez de l’aide.

Étapes suivantes

Découvrez les considérations relatives à l’utilisation de la plateforme Windows universelle avec MSAL.NET.