Använda Microsoft Authenticator eller Intune-företagsportal i Xamarin-program

På Android och iOS aktiverar koordinatorer som Microsoft Authenticator och Den Android-specifika Microsoft-Intune-företagsportal:

  • Enkel inloggning (SSO): Användare behöver inte logga in på varje program.
  • Enhetsidentifiering: Koordinatorn har åtkomst till enhetscertifikatet. Det här certifikatet skapas på enheten när det är anslutet till arbetsplatsen.
  • Verifiering av programidentifiering: När ett program anropar asynkron meddelandekö skickas dess omdirigerings-URL. Asynkron meddelandekö verifierar URL:en.

Om du vill aktivera någon av dessa funktioner använder du parametern WithBroker() när du anropar PublicClientApplicationBuilder.CreateApplication metoden. Parametern .WithBroker() är inställd på true som standard.

Konfigurationen av asynkron autentisering i Microsoft Authentication Library för .NET (MSAL.NET) varierar beroende på plattform:

Asynkron autentisering för iOS

Använd följande steg för att göra det möjligt för Xamarin.iOS-appen att kommunicera med Microsoft Authenticator-appen . Om du riktar in dig på iOS 13 kan du läsa om Apples icke-bakåtkompatibla API-ändring.

Steg 1: Aktivera stöd för asynkron meddelandekö

Du måste aktivera broker-stöd för enskilda instanser av PublicClientApplication. Supporten är inaktiverad som standard. När du skapar PublicClientApplication via PublicClientApplicationBuilderanvänder du parametern WithBroker() som visas i följande exempel. Parametern WithBroker() är inställd på true som standard.

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

Steg 2: Aktivera åtkomst till nyckelringar

Om du vill aktivera åtkomst till nyckelringar måste du ha en nyckelringsåtkomstgrupp för ditt program. Du kan använda API:et WithIosKeychainSecurityGroup() för att ange din nyckelringsåtkomstgrupp när du skapar ditt program:

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

Mer information finns i Aktivera nyckelringsåtkomst.

Steg 3: Uppdatera AppDelegate för att hantera återanropet

När MSAL.NET anropar asynkron meddelandekö anropar mäklaren tillbaka till ditt program via OpenUrl klassens AppDelegate metod. Eftersom MSAL väntar på koordinatorns svar måste ditt program samarbeta för att anropa MSAL.NET tillbaka. Om du vill aktivera det här samarbetet uppdaterar du filen AppDelegate.cs för att åsidosätta följande metod.

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

Den här metoden anropas varje gång programmet startas. Det används som en möjlighet att bearbeta svaret från asynkron meddelandekö och slutföra autentiseringsprocessen som MSAL.NET startat.

Steg 4: Ange UIViewController()

Ange ett objektfönster i filen AppDelegate.cs . Vanligtvis behöver du inte ange objektfönstret för Xamarin iOS, men du behöver ett objektfönster för att skicka och ta emot svar från asynkron meddelandekö.

Så här konfigurerar du objektfönstret:

  1. I filen AppDelegate.cs anger du App.RootViewController till en ny UIViewController(). Den här tilldelningen säkerställer att anropet till asynkron meddelandekö innehåller UIViewController. Om den här inställningen har tilldelats felaktigt kan du få det här felet:

    "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. I anropet AcquireTokenInteractive använder .WithParentActivityOrWindow(App.RootViewController) och skickar du sedan referensen till det objektfönster som du ska använda.

    I App.cs:

       public static object RootViewController { get; set; }
    

    I AppDelegate.cs:

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

    I anropet AcquireToken :

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

Steg 5: Registrera ett URL-schema

MSAL.NET använder URL:er för att anropa asynkron meddelandekö och sedan returnera koordinatorsvaret till din app. För att slutföra rundturen registrerar du ett URL-schema för din app i filen Info.plist .

Namnet CFBundleURLSchemes måste inkluderas msauth. som ett prefix. Följ prefixet med CFBundleURLName.

I URL-schemat BundleId identifierar appen unikt: $"msauth.(BundleId)". BundleId Om är är com.yourcompany.xformsurl-schemat msauth.com.yourcompany.xformsalltså .

Kommentar

Det här URL-schemat blir en del av omdirigerings-URI:n som unikt identifierar din app när den tar emot svaret från asynkron meddelandekö.

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

Steg 6: Lägg till koordinatoridentifieraren i avsnittet LSApplicationQueriesSchemes

MSAL använder –canOpenURL: för att kontrollera om asynkron meddelandekö är installerad på enheten. I iOS 9 låste Apple de scheman som ett program kan fråga efter.

Lägg till msauthv2 i LSApplicationQueriesSchemes avsnittet i filen Info.plist , som i följande exempel:

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

Steg 7: Lägga till en omdirigerings-URI i din appregistrering

Dricks

Stegen i den här artikeln kan variera något beroende på vilken portal du börjar från.

När du använder koordinatorn har din omdirigerings-URI ett extra krav. Omdirigerings-URI :n måste ha följande format:

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

Här är ett exempel:

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

Observera att omdirigerings-URI:n matchar namnet CFBundleURLSchemes som du inkluderade i filen Info.plist .

Lägg till omdirigerings-URI:n i appens registrering. Om du vill generera en korrekt formaterad omdirigerings-URI använder du Appregistreringar för att generera den asynkrona omdirigerings-URI:n från paket-ID:t.

Så här genererar du omdirigerings-URI:n:

  1. Logga in på administrationscentret för Microsoft Entra som minst molnprogramadministratör.

  2. Bläddra till Identitetsprogram>> Appregistreringar.

  3. Sök efter och välj programmet.

  4. Välj Autentisering>Lägg till en plattforms-iOS>/macOS

  5. Ange ditt paket-ID och välj sedan Konfigurera.

    Kopiera den genererade omdirigerings-URI:n som visas i textrutan Omdirigerings-URI för inkludering i koden:

    iOS platform settings with generated redirect URI

  6. Välj Klar för att slutföra genereringen av omdirigerings-URI:n.

Asynkron autentisering för Android

Steg 1: Aktivera stöd för asynkron meddelandekö

Broker-stöd aktiveras per-basisPublicClientApplication . Som standard är den inaktiverad. Använd parametern WithBroker() (inställd på true som standard) när du skapar IPublicClientApplication via PublicClientApplicationBuilder.

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

Steg 2: Uppdatera huvudaktiviteten för att hantera återanropet

När MSAL.NET anropar mäklaren anropar mäklaren i sin tur tillbaka till ditt program med OnActivityResult() metoden . Eftersom MSAL väntar på svaret från asynkron meddelandekö måste programmet dirigera resultatet till MSAL.NET.

Dirigera resultatet till metoden genom att SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data)OnActivityResult() åsidosätta metoden enligt följande:

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

Den här metoden anropas varje gång koordinatorprogrammet startas och används som en möjlighet att bearbeta svaret från asynkron meddelandekö och slutföra autentiseringsprocessen som startas av MSAL.NET.

Steg 3: Ange en aktivitet

Om du vill aktivera asynkron autentisering anger du en aktivitet så att MSAL kan skicka och ta emot svaret till och från asynkron meddelandekö. Om du vill göra det anger du aktiviteten (vanligtvis MainActivity) till WithParentActivityOrWindow(object parent) det överordnade objektet.

I anropet till :AcquireTokenInteractive()

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

Steg 4: Lägg till en omdirigerings-URI i din appregistrering

MSAL använder URL:er för att anropa asynkron meddelandekö och sedan återgå till din app. För att slutföra tur och retur registrerar du en omdirigerings-URI för din app.

Formatet för omdirigerings-URI:n för ditt program beror på vilket certifikat som används för att signera APK:n. Till exempel:

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

Den sista delen av URI:n, hgbUYHVBYUTvuvT&Y6tr554365466=, är den Base64-kodade versionen av signaturen som APK är signerad med. När du utvecklar din app i Visual Studio, om du felsöker koden utan att signera APK med ett specifikt certifikat, signerar Visual Studio APK åt dig i felsökningssyfte. När Visual Studio signerar APK:t åt dig på det här sättet ger det en unik signatur för den dator som den bygger på. Varje gång du skapar appen på en annan dator måste du därför uppdatera omdirigerings-URI:n i programmets kod och programmets registrering för att kunna autentisera med MSAL.

När du felsöker kan du stöta på ett MSAL-undantag (eller ett loggmeddelande) som anger att den angivna omdirigerings-URI:n är felaktig. Undantaget eller loggmeddelandet anger också den omdirigerings-URI som du ska använda med den aktuella datorn som du felsöker på. Du kan använda den angivna omdirigerings-URI:n för att fortsätta utveckla din app så länge du uppdaterar omdirigerings-URI:n i koden och lägga till den angivna omdirigerings-URI:n i appens registrering.

När du är redo att slutföra koden uppdaterar du omdirigerings-URI:n i koden och programmets registrering för att använda signaturen för det certifikat som du signerar APK med.

I praktiken innebär det att du bör överväga att lägga till en omdirigerings-URI för varje medlem i utvecklingsteamet, plus en omdirigerings-URI för den produktionssignerade versionen av APK.

Du kan beräkna signaturen själv, ungefär så här gör 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.
      }
   }

Du har också möjlighet att hämta signaturen för paketet med hjälp av keytool med följande kommandon:

  • 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
    

Steg 5 (valfritt): Återgå till systemwebbläsaren

Om MSAL har konfigurerats för att använda asynkron meddelandekö men asynkron meddelandekö inte är installerad återgår MSAL till att använda en webbvy (en webbläsare). MSAL försöker autentisera med standardsystemwebbläsaren på enheten, vilket misslyckas eftersom omdirigerings-URI:n har konfigurerats för koordinatorn och systemläsaren inte vet hur den ska användas för att gå tillbaka till MSAL. För att undvika felet kan du konfigurera ett avsiktsfilter med den omdirigerings-URI för asynkron meddelandekö som du använde i steg 4.

Ändra programmets manifest för att lägga till avsiktsfiltret:

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

Om du till exempel har en omdirigerings-URI för msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=bör manifestet se ut som följande XML-kodfragment.

Snedstrecket (/) framför signaturen i android:path värdet krävs.

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

Mer information om hur du konfigurerar programmet för systemwebbläsare och Android 11-stöd finns i Uppdatera Android-manifestet för stöd för systemwebbläsare.

Alternativt kan du konfigurera MSAL att återgå till den inbäddade webbläsaren, som inte förlitar sig på en omdirigerings-URI:

.WithUseEmbeddedWebUi(true)

Felsökningstips för android-asynkron autentisering

Här följer några tips om hur du undviker problem när du implementerar asynkron autentisering på Android:

  • Omdirigerings-URI – Lägg till en omdirigerings-URI i din programregistrering. En saknad eller felaktig omdirigerings-URI är ett vanligt problem som påträffas av utvecklare.

  • Broker-version – Installera den lägsta nödvändiga versionen av broker-apparna. Någon av dessa två appar kan användas för asynkron autentisering på Android.

    • Intune-företagsportal (version 5.0.4689.0 eller senare)
    • Microsoft Authenticator (version 6.2001.0140 eller senare).
  • Asynkron prioritet – MSAL kommunicerar med den första asynkron meddelandekö som är installerad på enheten när flera asynkrona meddelandeköer installeras.

    Exempel: Om du först installerar Microsoft Authenticator och sedan installerar Intune-företagsportal sker asynkron autentisering endast på Microsoft Authenticator.

  • Loggar – Om du stöter på ett problem med asynkron autentisering kan det hjälpa dig att diagnostisera orsaken genom att visa mäklarens loggar.

    • Hämta Microsoft Authenticator-loggar:

      1. Välj menyknappen i det övre högra hörnet i appen.
      2. Välj Skicka feedback>med problem?.
      3. Under Vad försöker du göra? väljer du ett alternativ och lägger till en beskrivning.
      4. Om du vill skicka loggarna väljer du pilen i appens övre högra hörn.

      När du har skickat loggarna visas incident-ID:t i en dialogruta. Registrera incident-ID:t och inkludera det när du begär hjälp.

    • Hämta Intune-företagsportal loggar:

      1. Välj menyknappen i det övre vänstra hörnet i appen.
      2. Välj Hjälp>e-postsupport.
      3. Om du vill skicka loggarna väljer du Ladda upp endast loggar.

      När du har skickat loggarna visas incident-ID:t i en dialogruta. Registrera incident-ID:t och inkludera det när du begär hjälp.

Nästa steg

Lär dig mer om överväganden för att använda Universell Windows-plattform med MSAL.NET.