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. AuthenticationContinuationHelper
NET .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://auth
napří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.