Použití aplikace Microsoft Authenticator nebo Portál společnosti Intune v aplikacích Xamarin

V androidu a iOSu zprostředkovatelé, jako je Microsoft Authenticator a Microsoft Portál společnosti Intune specifické pro Android, povolte:

  • Jednotné přihlašování (SSO): Uživatelé se nemusí přihlašovat ke každé aplikaci.
  • Identifikace zařízení: Zprostředkovatel přistupuje k certifikátu zařízení. Tento certifikát se vytvoří na zařízení, když je připojený k pracovišti.
  • Ověření identifikace aplikace: Když aplikace zavolá zprostředkovatele, předá adresu URL přesměrování. Zprostředkovatel ověří adresu URL.

Pokud chcete povolit některou z těchto funkcí, použijte WithBroker() parametr při volání PublicClientApplicationBuilder.CreateApplication metody. Parametr .WithBroker() je ve výchozím nastavení nastavený na true.

Nastavení zprostředkovaného ověřování v knihovně Microsoft Authentication Library pro .NET (MSAL.NET) se liší podle platformy:

Zprostředkované ověřování pro iOS

Pomocí následujících kroků povolíte aplikaci Xamarin.iOS komunikovat s aplikací Microsoft Authenticator . Pokud cílíte na iOS 13, zvažte čtení o zásadní změně rozhraní API společnosti Apple.

Krok 1: Povolení podpory zprostředkovatele

Je nutné povolit podporu zprostředkovatele pro jednotlivé instance PublicClientApplication. Podpora je ve výchozím nastavení zakázaná. Při vytváření PublicClientApplication pomocí PublicClientApplicationBuilderpříkazu použijte WithBroker() parametr, jak ukazuje následující příklad. Parametr WithBroker() je ve výchozím nastavení nastavený na true.

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

Krok 2: Povolení přístupu ke klíčence

Pokud chcete povolit přístup ke svazku klíčů, musíte mít pro aplikaci přístupovou skupinu řetězce klíčů. Rozhraní API můžete použít WithIosKeychainSecurityGroup() k nastavení přístupové skupiny řetězce klíčů při vytváření aplikace:

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

Další informace najdete v tématu Povolení přístupu ke klíčence.

Krok 3: Aktualizace AppDelegate pro zpracování zpětného volání

Když MSAL.NET volá zprostředkovatele, zprostředkovatel volá zpět do vaší aplikace prostřednictvím OpenUrl metody AppDelegate třídy. Vzhledem k tomu, že MSAL čeká na odpověď zprostředkovatele, musí vaše aplikace spolupracovat, aby volala MSAL.NET zpět. Chcete-li tuto spolupráci povolit, aktualizujte soubor AppDelegate.cs tak, aby přepsal následující metodu.

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

Tato metoda se vyvolá při každém spuštění aplikace. Používá se jako příležitost zpracovat odpověď od zprostředkovatele a dokončit proces ověřování, který MSAL.NET spustil.

Krok 4: Nastavení UIViewController()

Stále v souboru AppDelegate.cs nastavte okno objektu. Obvykle není nutné nastavit okno objektu pro Xamarin iOS, ale potřebujete okno objektu k odesílání a přijímání odpovědí od zprostředkovatele.

Nastavení okna objektu:

  1. V souboru AppDelegate.cs nastavte App.RootViewController na nový UIViewController(). Toto přiřazení zajišťuje, že volání do zprostředkovatele zahrnuje UIViewController. Pokud je toto nastavení přiřazeno nesprávně, může se zobrazit tato chyba:

    "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 Při volání použijte .WithParentActivityOrWindow(App.RootViewController) a předejte odkaz na okno objektu, které použijete.

    V App.cs:

       public static object RootViewController { get; set; }
    

    V AppDelegate.cs:

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

    AcquireToken Ve volání:

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

Krok 5: Registrace schématu adres URL

MSAL.NET používá adresy URL k vyvolání zprostředkovatele a následné vrácení odpovědi zprostředkovatele do vaší aplikace. Pokud chcete dokončit zpáteční cestu, zaregistrujte schéma adres URL pro vaši aplikaci v souboru Info.plist .

Název CFBundleURLSchemes musí být součástí msauth. předpony. Postupujte podle předpony s příponou CFBundleURLName.

V schématu BundleId adres URL jednoznačně identifikuje aplikaci: $"msauth.(BundleId)". Takže pokud BundleId je com.yourcompany.xforms, pak je schéma msauth.com.yourcompany.xformsadresy URL .

Poznámka:

Toto schéma adres URL se stane součástí identifikátoru URI přesměrování, který jednoznačně identifikuje vaši aplikaci, když obdrží odpověď od zprostředkovatele.

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

Krok 6: Přidání identifikátoru zprostředkovatele do oddílu LSApplicationQueriesSchemes

MSAL používá –canOpenURL: ke kontrole, jestli je na zařízení nainstalovaný zprostředkovatel. V iOSu 9 společnost Apple uzamkne schémata, na která se aplikace může dotazovat.

Přidejte msauthv2 do LSApplicationQueriesSchemes části souboru Info.plist , jak je znázorněno v následujícím příkladu:

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

Krok 7: Přidání identifikátoru URI přesměrování do registrace aplikace

Tip

Postup v tomto článku se může mírně lišit v závislosti na portálu, od který začínáte.

Při použití zprostředkovatele má identifikátor URI přesměrování další požadavek. Identifikátor URI přesměrování musí mít následující formát:

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

Tady je příklad:

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

Všimněte si, že identifikátor URI přesměrování odpovídá CFBundleURLSchemes názvu, který jste zahrnuli do souboru Info.plist .

Přidejte identifikátor URI přesměrování do registrace aplikace. Pokud chcete vygenerovat správně formátovaný identifikátor URI přesměrování, použijte Registrace aplikací k vygenerování zprostředkovaného identifikátoru URI přesměrování z ID sady prostředků.

Vygenerování identifikátoru URI přesměrování:

  1. Přihlaste se do Centra pro správu Microsoft Entra jako alespoň cloudová aplikace Správa istrator.

  2. Přejděte k aplikacím> identit>Registrace aplikací.

  3. Vyhledejte a vyberte aplikaci.

  4. Výběr možnosti Přidat>platformu>pro iOS nebo macOS

  5. Zadejte ID sady prostředků a pak vyberte Konfigurovat.

    Zkopírujte vygenerovaný identifikátor URI přesměrování, který se zobrazí v textovém poli Identifikátor URI přesměrování pro zahrnutí do kódu:

    iOS platform settings with generated redirect URI

  6. Výběrem možnosti Hotovo dokončete generování identifikátoru URI přesměrování.

Zprostředkované ověřování pro Android

Krok 1: Povolení podpory zprostředkovatele

Podpora zprostředkovatele je povolená pro jednotlivéPublicClientApplication účely. Ve výchozím nastavení je vypnuto. WithBroker() Při vytváření IPublicClientApplication prostřednictvím příkazu použijte parametr (nastavený na hodnotu true ve výchozím nastavení).PublicClientApplicationBuilder

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

Krok 2: Aktualizace hlavní aktivity pro zpracování zpětného volání

Když MSAL.NET zavolá zprostředkovatele, zprostředkuje volání zpět do vaší aplikace metodou OnActivityResult() . Vzhledem k tomu, že MSAL bude čekat na odpověď od zprostředkovatele, musí vaše aplikace směrovat výsledek na MSAL.NET.

Nasměrujte výsledek na metodu SetAuthenticationContinuationEventArgs(int requestCode, Result resultCode, Intent data) přepsáním OnActivityResult() metody, jak je znázorněno zde:

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

Tato metoda se vyvolá při každém spuštění zprostředkované aplikace a používá se jako příležitost zpracovat odpověď od zprostředkovatele a dokončit proces ověřování zahájený MSAL.NET.

Krok 3: Nastavení aktivity

Pokud chcete povolit zprostředkované ověřování, nastavte aktivitu tak, aby služba MSAL mohla odesílat a přijímat odpověď na zprostředkovatele a od zprostředkovatele. Chcete-li to provést, zadejte aktivitu (obvykle MainActivity) WithParentActivityOrWindow(object parent) nadřazeného objektu.

Například při volání:AcquireTokenInteractive()

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

Krok 4: Přidání identifikátoru URI přesměrování do registrace aplikace

Knihovna MSAL používá k vyvolání zprostředkovatele adresy URL a pak se vrátí do aplikace. K dokončení této doby odezvy zaregistrujte identifikátor URI přesměrování pro vaši aplikaci.

Formát identifikátoru URI přesměrování pro vaši aplikaci závisí na certifikátu použitém k podepsání APK. Příklad:

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

Poslední část identifikátoru URI je hgbUYHVBYUTvuvT&Y6tr554365466=verze s kódováním Base64 podpisu, ke které je APK podepsán. Pokud při vývoji aplikace v sadě Visual Studio ladíte kód bez podepsání APK s konkrétním certifikátem, Visual Studio vás k ladění podepíše. Když Visual Studio tímto způsobem podepíše APK, poskytne mu jedinečný podpis pro počítač, na který je postaven. Proto při každém sestavení aplikace na jiném počítači budete muset aktualizovat identifikátor URI přesměrování v kódu aplikace a registraci aplikace, aby bylo možné provést ověření v knihovně MSAL.

Při ladění může dojít k výjimce MSAL (nebo zprávě protokolu), která hlásí, že zadaný identifikátor URI přesměrování je nesprávný. Zpráva o výjimce nebo protokolu také označuje identifikátor URI přesměrování, který byste měli používat s aktuálním počítačem, na kterém ladíte. Pomocí zadaného identifikátoru URI přesměrování můžete pokračovat v vývoji aplikace, pokud aktualizujete identifikátor URI přesměrování v kódu a přidáte zadaný identifikátor URI přesměrování do registrace aplikace.

Jakmile budete připraveni dokončit kód, aktualizujte identifikátor URI přesměrování v kódu a registraci aplikace tak, aby používal podpis certifikátu, kterým apk podepisujete.

V praxi to znamená, že byste měli zvážit přidání identifikátoru URI přesměrování pro každého člena vývojového týmu a identifikátor URI přesměrování pro produkční podepsanou verzi APK.

Podpis můžete vypočítat sami, podobně jako služba 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.
      }
   }

Máte také možnost získat podpis pro váš balíček pomocí keytool s následujícími příkazy:

  • 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
    

Krok 5 (volitelné): Vraťte se do systémového prohlížeče

Pokud je služba MSAL nakonfigurovaná tak, aby používala zprostředkovatele, ale zprostředkovatel není nainstalovaný, služba MSAL se vrátí do webového zobrazení (prohlížeč). Služba MSAL se pokusí ověřit pomocí výchozího systémového prohlížeče na zařízení, což selže, protože identifikátor URI přesměrování je nakonfigurovaný pro zprostředkovatele a systémový prohlížeč neví, jak ho použít k návratu do knihovny MSAL. Abyste se vyhnuli selhání, můžete nakonfigurovat filtr záměru s identifikátorem URI přesměrování zprostředkovatele, který jste použili v kroku 4.

Upravte manifest aplikace tak, aby přidal filtr záměru:

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

Pokud například máte identifikátor URI msauth://com.microsoft.xforms.testApp/hgbUYHVBYUTvuvT&Y6tr554365466=přesměrování , měl by manifest vypadat jako následující fragment kódu XML.

Je vyžadován lomítko (/) před podpisem v hodnotěandroid:path.

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

Další informace o konfiguraci aplikace pro podporu systémového prohlížeče a Androidu 11 najdete v tématu Aktualizace manifestu Androidu pro podporu systémového prohlížeče.

Jako alternativu můžete službu MSAL nakonfigurovat tak, aby se vrátila do vloženého prohlížeče, který nespoléhá na identifikátor URI přesměrování:

.WithUseEmbeddedWebUi(true)

Tipy pro řešení potíží se zprostředkovaným ověřováním v Androidu

Tady je několik tipů, jak se vyhnout problémům při implementaci zprostředkovaného ověřování v Androidu:

  • Identifikátor URI přesměrování – Přidejte identifikátor URI přesměrování do registrace aplikace. Chybějící nebo nesprávný identifikátor URI přesměrování je běžným problémem, ke kterému dochází vývojáři.

  • Verze zprostředkovatele – Nainstalujte minimální požadovanou verzi zprostředkovaných aplikací. Jednu z těchto dvou aplikací je možné použít pro zprostředkované ověřování v Androidu.

    • Portál společnosti Intune (verze 5.0.4689.0 nebo novější)
    • Microsoft Authenticator (verze 6.2001.0140 nebo novější)
  • Priorita zprostředkovatele – SLUŽBA MSAL komunikuje s prvním zprostředkovatelem nainstalovaným na zařízení při instalaci více zprostředkovatelů.

    Příklad: Pokud nejprve nainstalujete Aplikaci Microsoft Authenticator a pak nainstalujete Portál společnosti Intune, zprostředkované ověřování proběhne pouze v aplikaci Microsoft Authenticator.

  • Protokoly – Pokud narazíte na problém s zprostředkovaným ověřováním, může vám s diagnostikou příčiny pomoct zobrazení protokolů zprostředkovatele.

    • Získejte protokoly Microsoft Authenticatoru:

      1. Vyberte tlačítko nabídky v pravém horním rohu aplikace.
      2. Vyberte Poslat zpětnou vazbu>s problémy?
      3. V části Co se pokoušíte udělat?, vyberte možnost a přidejte popis.
      4. Pokud chcete protokoly odeslat, vyberte šipku v pravém horním rohu aplikace.

      Po odeslání protokolů se v dialogovém okně zobrazí ID incidentu. Poznamenejte si ID incidentu a při žádosti o pomoc ho zahrňte.

    • Získejte protokoly Portál společnosti Intune:

      1. Vyberte tlačítko nabídky v levém horním rohu aplikace.
      2. Vyberte e-mailovou podporu nápovědy>.
      3. Pokud chcete protokoly odeslat, vyberte Nahrát pouze protokoly.

      Po odeslání protokolů se v dialogovém okně zobrazí ID incidentu. Poznamenejte si ID incidentu a při žádosti o pomoc ho zahrňte.

Další kroky

Přečtěte si o aspektech použití Univerzální platforma Windows s MSAL.NET.