Sdílet prostřednictvím


Požadavky na konfiguraci a tipy pro řešení potíží pro Xamarin Android s MSAL.NET

Při použití Xamarin Androidu s knihovnou Microsoft Authentication Library pro .NET (MSAL.NET) musíte v kódu provést několik změn konfigurace. Následující části popisují požadované úpravy, za kterými následuje část Řešení potíží , která vám pomůže vyhnout se některým nejběžnějším problémům.

Poznámka:

MSAL.NET verze 4.61.0 a vyšší neposkytují podporu pro Univerzální platforma Windows (UPW), Xamarin Android a Xamarin iOS. Doporučujeme migrovat aplikace Xamarinu do moderních architektur, jako je MAUI. Přečtěte si další informace o vyřazení v oznámení nadcházejícího vyřazení MSAL.NET pro Xamarin a UPW.

Nastavení nadřazené aktivity

V Xamarin Androidu nastavte nadřazenou aktivitu tak, aby se token vrátil po interakci:

var authResult = AcquireTokenInteractive(scopes)
 .WithParentActivityOrWindow(parentActivity)
 .ExecuteAsync();

V MSAL.NET verze 4.2 a novější můžete tuto funkci nastavit také na úrovni aplikace [PublicClientApplication][PublicClientApplication]. Uděláte to tak, že použijete zpětné volání:

// Requires MSAL.NET 4.2 or later
var pca = PublicClientApplicationBuilder
  .Create("<your-client-id-here>")
  .WithParentActivityOrWindow(() => parentActivity)
  .Build();

Pokud použijete CurrentActivityPlugin, měl by kód tvůrce [PublicClientApplication][PublicClientApplication] vypadat podobně jako tento fragment kódu:

// Requires MSAL.NET 4.2 or later
var pca = PublicClientApplicationBuilder
  .Create("<your-client-id-here>")
  .WithParentActivityOrWindow(() => CrossCurrentActivity.Current)
  .Build();

Ujistěte se, že se ovládací prvek vrátí do knihovny MSAL.

Když interaktivní část toku ověřování skončí, vraťte řízení do KNIHOVNY MSAL přepsáním [Activity][Aktivita].[OnActivityResult()] Metoda [OnActivityResult]

V přepsání zavolejte MSAL. AuthenticationContinuationHelperNET .SetAuthenticationContinuationEventArgs() metoda pro vrácení řízení do MSAL na konci interaktivní části ověřovacího toku.

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

    // Return control to MSAL
    AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode,
                                                                            resultCode,
                                                                            data);
}

Aktualizace manifestu Androidu pro podporu System WebView

Pro podporu system WebView by soubor AndroidManifest.xml měl obsahovat následující hodnoty:

<activity android:name="microsoft.identity.client.BrowserTabActivity" android:configChanges="orientation|screenSize" android:exported="true">
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="msal{Client Id}" android:host="auth" />
  </intent-filter>
</activity>

Hodnota android:scheme se vytvoří z identifikátoru URI přesměrování, který je nakonfigurovaný na portálu aplikace. Pokud je msal00001111-aaaa-2222-bbbb-3333cccc4444://authnapříklad identifikátor URI přesměrování, android:scheme položka v manifestu by vypadala jako v tomto příkladu:

<data android:scheme="msal00001111-aaaa-2222-bbbb-3333cccc4444" android:host="auth" />

Případně vytvořte aktivitu v kódu místo ruční úpravy AndroidManifest.xml. Pokud chcete vytvořit aktivitu v kódu, nejprve vytvořte třídu, která obsahuje Activity atribut a IntentFilter atribut.

Tady je příklad třídy, která představuje hodnoty souboru XML:

  [Activity(Exported = true)]
  [IntentFilter(new[] { Intent.ActionView },
        Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
        DataHost = "auth",
        DataScheme = "msal{client_id}")]
  public class MsalActivity : BrowserTabActivity
  {
  }

Použití System WebView ve zprostředkované ověřování

Pokud chcete použít System WebView jako záložní řešení pro interaktivní ověřování, když jste aplikaci nakonfigurovali tak, aby používala zprostředkované ověřování a zařízení nemá nainstalovaného zprostředkovatele, povolte službě MSAL zachycení odpovědi ověřování pomocí identifikátoru URI přesměrování zprostředkovatele. MsAL se pokusí ověřit pomocí výchozího system WebView na zařízení, když zjistí, že zprostředkovatel není k dispozici. Pokud použijete tuto výchozí hodnotu, selže, protože identifikátor URI přesměrování je nakonfigurovaný tak, aby používal zprostředkovatele, a System WebView neví, jak ho použít k návratu do knihovny MSAL. Pokud chcete tento problém vyřešit, vytvořte filtr záměru pomocí identifikátoru URI přesměrování zprostředkovatele, který jste nakonfigurovali dříve. Přidejte filtr záměru úpravou manifestu vaší aplikace jako v tomto příkladu:

<!--Intent filter to capture System WebView or Authenticator calling back to our app after sign-in-->
<activity
      android:name="microsoft.identity.client.BrowserTabActivity">
    <intent-filter>
          <action android:name="android.intent.action.VIEW" />
          <category android:name="android.intent.category.DEFAULT" />
          <category android:name="android.intent.category.BROWSABLE" />
          <data android:scheme="msauth"
              android:host="Enter_the_Package_Name"
              android:path="/Enter_the_Signature_Hash" />
    </intent-filter>
</activity>

Nahraďte hodnotu názvem balíčku, který jste zaregistrovali na webu Azure Portal android:host= . Nahraďte hodnotu hodnotou hash klíče, kterou jste zaregistrovali na webu Azure Portal android:path= . Hodnota hash podpisu by neměla být zakódovaná adresou URL. Ujistěte se, že se na začátku hodnoty hash podpisu zobrazí počáteční lomítko (/).

Manifest Xamarin.Forms 4.3.x

Xamarin.Forms 4.3.x generuje kód, který nastaví package atribut v com.companyname.{appName} AndroidManifest.xml. Pokud použijete DataScheme jako msal{client_id}, můžete chtít změnit hodnotu tak, aby odpovídala hodnotě MainActivity.cs oboru názvů.

Podpora Androidu 11

Pokud chcete používat systémový prohlížeč a zprostředkované ověřování v Androidu 11, musíte tyto balíčky nejprve deklarovat, aby byly viditelné pro aplikaci. Aplikace, které cílí na Android 10 (API 29) a starší, můžou operační systém dotazovat na seznam balíčků, které jsou v daném okamžiku dostupné na zařízení. Pro podporu ochrany osobních údajů a zabezpečení Android 11 snižuje viditelnost balíčků na výchozí seznam balíčků operačního systému a balíčků zadaných v souboru AndroidManifest.xml aplikace.

Pokud chcete aplikaci povolit ověřování pomocí systémového prohlížeče i zprostředkovatele, přidejte do AndroidManifest.xml následující část:

<!-- Required for API Level 30 to make sure the app can detect browsers and other apps where communication is needed.-->
<!--https://developer.android.com/training/basics/intents/package-visibility-use-cases-->
<queries>
  <package android:name="com.azure.authenticator" />
  <package android:name="{Package Name}" />
  <package android:name="com.microsoft.windowsintune.companyportal" />
  <!-- Required for API Level 30 to make sure the app detect browsers
      (that don't support custom tabs) -->
  <intent>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.BROWSABLE" />
    <data android:scheme="https" />
  </intent>
  <!-- Required for API Level 30 to make sure the app can detect browsers that support custom tabs -->
  <!-- https://developers.google.com/web/updates/2020/07/custom-tabs-android-11#detecting_browsers_that_support_custom_tabs -->
  <intent>
    <action android:name="android.support.customtabs.action.CustomTabsService" />
  </intent>
</queries>

Nahraďte {Package Name} názvem balíčku aplikace.

Aktualizovaný manifest, který teď obsahuje podporu systémového prohlížeče a zprostředkovaného ověřování, by měl vypadat podobně jako v tomto příkladu:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="1" android:versionName="1.0" package="com.companyname.XamarinDev">
    <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="30" />
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <application android:theme="@android:style/Theme.NoTitleBar">
        <activity android:name="microsoft.identity.client.BrowserTabActivity" android:configChanges="orientation|screenSize">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="msal00001111-aaaa-2222-bbbb-3333cccc4444" android:host="auth" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="msauth" android:host="com.companyname.XamarinDev" android:path="/Fc4l/5I4mMvLnF+l+XopDuQ2gEM=" />
            </intent-filter>
        </activity>
    </application>
    <!-- Required for API Level 30 to make sure we can detect browsers and other apps we want to
     be able to talk to.-->
    <!--https://developer.android.com/training/basics/intents/package-visibility-use-cases-->
    <queries>
        <package android:name="com.azure.authenticator" />
        <package android:name="com.companyname.xamarindev" />
        <package android:name="com.microsoft.windowsintune.companyportal" />
        <!-- Required for API Level 30 to make sure we can detect browsers
        (that don't support custom tabs) -->
        <intent>
            <action android:name="android.intent.action.VIEW" />
            <category android:name="android.intent.category.BROWSABLE" />
            <data android:scheme="https" />
        </intent>
        <!-- Required for API Level 30 to make sure we can detect browsers that support custom tabs -->
        <!-- https://developers.google.com/web/updates/2020/07/custom-tabs-android-11#detecting_browsers_that_support_custom_tabs -->
        <intent>
            <action android:name="android.support.customtabs.action.CustomTabsService" />
        </intent>
    </queries>
</manifest>

Použití vloženého webového zobrazení (volitelné)

Ve výchozím nastavení MSAL.NET používá systémový webový prohlížeč. Tento prohlížeč umožňuje získat jednotné přihlašování pomocí webových aplikací a dalších aplikací. V některých výjimečných případech můžete chtít, aby váš systém používal vložené webové zobrazení.

Tento příklad kódu ukazuje, jak nastavit vložené webové zobrazení:

bool useEmbeddedWebView = !app.IsSystemWebViewAvailable;

var authResult = AcquireTokenInteractive(scopes)
 .WithParentActivityOrWindow(parentActivity)
 .WithEmbeddedWebView(useEmbeddedWebView)
 .ExecuteAsync();

Další informace najdete v tématu Použití webových prohlížečů k MSAL.NET a aspektům systémového prohlížeče Xamarin Android.

Řešení problému

Obecné tipy

  • Aktualizujte existující balíček NuGet MSAL.NET na nejnovější verzi MSAL.NET.
  • Ověřte, že Xamarin.Forms je v nejnovější verzi.
  • Ověřte, že Xamarin.Android.Support.v4 je na nejnovější verzi.
  • Ujistěte se, že všechny balíčky Xamarin.Android.Support cílí na nejnovější verzi.
  • Vyčistěte nebo znovu sestavte aplikaci.
  • V sadě Visual Studio zkuste nastavit maximální počet paralelních sestavení projektu na 1. Uděláte to tak, že vyberete Možnosti>Projektů a Řešení>Sestavení a Spustit>maximální počet sestavení paralelních projektů.
  • Pokud vytváříte z příkazového řádku a používá se příkaz /m, zkuste tento prvek z příkazu odebrat.

Chyba: Název AuthenticationContinuationHelper v aktuálním kontextu neexistuje.

Pokud chyba značí, že AuthenticationContinuationHelper v aktuálním kontextu neexistuje, sada Visual Studio pravděpodobně nesprávně aktualizovala soubor Android.csproj* . Někdy cesta k souboru v elementu <HintPath> nesprávně obsahuje netstandard13 místo monoandroid90.

Tento příklad obsahuje správnou cestu k souboru:

<Reference Include="Microsoft.Identity.Client, Version=3.0.4.0, Culture=neutral, PublicKeyToken=0a613f4dd989e8ae,
           processorArchitecture=MSIL">
  <HintPath>..\..\packages\Microsoft.Identity.Client.3.0.4-preview\lib\monoandroid90\Microsoft.Identity.Client.dll</HintPath>
</Reference>

Další kroky

Pokud si chcete vyzkoušet další ukázky, mobilní veřejné klientské aplikace.