Wymagania dotyczące konfiguracji i porady dotyczące rozwiązywania problemów dotyczące platformy Xamarin Dla systemu Android z MSAL.NET
Istnieje kilka zmian konfiguracji, które należy wprowadzić w kodzie podczas korzystania z platformy Xamarin Android z biblioteką Microsoft Authentication Library for .NET (MSAL.NET). W poniższych sekcjach opisano wymagane modyfikacje, a następnie sekcję Rozwiązywanie problemów , aby uniknąć niektórych typowych problemów.
Uwaga
MSAL.NET w wersji 4.61.0 lub nowszej nie zapewniają obsługi platforma uniwersalna systemu Windows (UWP), Xamarin Android i Xamarin iOS. Zalecamy migrację aplikacji platformy Xamarin do nowoczesnych struktur, takich jak MAUI. Przeczytaj więcej o wycofaniu w temacie Ogłaszanie nadchodzącego wycofania MSAL.NET dla platform Xamarin i platformy UWP.
Ustawianie działania nadrzędnego
W środowisku Xamarin Android ustaw działanie nadrzędne, aby token był zwracany po interakcji:
var authResult = AcquireTokenInteractive(scopes)
.WithParentActivityOrWindow(parentActivity)
.ExecuteAsync();
W MSAL.NET 4.2 i nowszych można również ustawić tę funkcję na poziomie [PublicClientApplication][PublicClientApplication]. W tym celu użyj wywołania zwrotnego:
// Requires MSAL.NET 4.2 or later
var pca = PublicClientApplicationBuilder
.Create("<your-client-id-here>")
.WithParentActivityOrWindow(() => parentActivity)
.Build();
Jeśli używasz elementu CurrentActivityPlugin, kod konstruktora [PublicClientApplication
][PublicClientApplication] powinien wyglądać podobnie do tego fragmentu kodu:
// Requires MSAL.NET 4.2 or later
var pca = PublicClientApplicationBuilder
.Create("<your-client-id-here>")
.WithParentActivityOrWindow(() => CrossCurrentActivity.Current)
.Build();
Upewnij się, że kontrolka powraca do biblioteki MSAL
Po zakończeniu interakcyjnego przepływu uwierzytelniania powróć do biblioteki MSAL, przesłaniając element [Activity
][Działanie].[OnActivityResult()
][OnActivityResult], metoda.
W przesłonięć wywołaj bibliotekę MSAL. Net's AuthenticationContinuationHelper
.SetAuthenticationContinuationEventArgs()
metoda zwracania kontroli do biblioteki MSAL na końcu interaktywnej części przepływu uwierzytelniania.
protected override void OnActivityResult(int requestCode,
Result resultCode,
Intent data)
{
base.OnActivityResult(requestCode, resultCode, data);
// Return control to MSAL
AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(requestCode,
resultCode,
data);
}
Aktualizowanie manifestu systemu Android dla obsługi elementu System WebView
Aby obsługiwać system WebView, plik AndroidManifest.xml powinien zawierać następujące wartości:
<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>
Wartość android:scheme
jest tworzona na podstawie identyfikatora URI przekierowania skonfigurowanego w portalu aplikacji. Jeśli na przykład identyfikator URI przekierowania to msal00001111-aaaa-2222-bbbb-3333cccc4444://auth
, android:scheme
wpis w manifeście będzie wyglądać następująco:
<data android:scheme="msal00001111-aaaa-2222-bbbb-3333cccc4444" android:host="auth" />
Alternatywnie utwórz działanie w kodzie, a nie ręcznie edytuj AndroidManifest.xml. Aby utworzyć działanie w kodzie, najpierw utwórz klasę zawierającą Activity
atrybut i IntentFilter
atrybut.
Oto przykład klasy reprezentującej wartości pliku XML:
[Activity(Exported = true)]
[IntentFilter(new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryBrowsable, Intent.CategoryDefault },
DataHost = "auth",
DataScheme = "msal{client_id}")]
public class MsalActivity : BrowserTabActivity
{
}
Używanie elementu System WebView w uwierzytelnianiu obsługiwanym przez brokera
Aby użyć elementu System WebView jako rezerwowego uwierzytelniania interakcyjnego, gdy skonfigurowano aplikację do korzystania z uwierzytelniania obsługiwanego przez brokera, a urządzenie nie ma zainstalowanego brokera, włącz bibliotekę MSAL w celu przechwycenia odpowiedzi uwierzytelniania przy użyciu identyfikatora URI przekierowania brokera. Biblioteka MSAL podejmie próbę uwierzytelnienia przy użyciu domyślnego elementu System WebView na urządzeniu, gdy wykryje, że broker jest niedostępny. Użycie tej wartości domyślnej zakończy się niepowodzeniem, ponieważ identyfikator URI przekierowania jest skonfigurowany do korzystania z brokera, a system WebView nie wie, jak używać go do powrotu do biblioteki MSAL. Aby rozwiązać ten problem, utwórz filtr intencji przy użyciu skonfigurowanego wcześniej identyfikatora URI przekierowania brokera. Dodaj filtr intencji, modyfikując manifest aplikacji w następujący sposób:
<!--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>
Zastąp wartość nazwą pakietu zarejestrowaną android:host=
w witrynie Azure Portal. Zastąp wartość skrótem klucza zarejestrowanym w witrynie Azure Portal android:path=
. Skrót podpisu nie powinien być zakodowany w adresie URL. Upewnij się, że na początku skrótu podpisu pojawia się wiodący ukośnik (/
).
Manifest platformy Xamarin.Forms 4.3.x
Program Xamarin.Forms 4.3.x generuje kod, który ustawia package
atrybut na com.companyname.{appName}
w AndroidManifest.xml. Jeśli używasz DataScheme
wartości jako msal{client_id}
, możesz zmienić wartość tak, aby odpowiadała wartości MainActivity.cs
przestrzeni nazw.
Obsługa systemu Android 11
Aby użyć przeglądarki systemowej i uwierzytelniania obsługiwanego przez brokera w systemie Android 11, należy najpierw zadeklarować te pakiety, aby były widoczne dla aplikacji. Aplikacje przeznaczone dla systemu Android 10 (API 29) i starsze mogą wykonywać zapytania dotyczące systemu operacyjnego, aby uzyskać listę pakietów dostępnych na urządzeniu w danym momencie. Aby zapewnić ochronę prywatności i bezpieczeństwo, system Android 11 zmniejsza widoczność pakietów systemu operacyjnego do domyślnej listy pakietów systemu operacyjnego oraz pakietów określonych w pliku AndroidManifest.xml aplikacji.
Aby umożliwić aplikacji uwierzytelnianie przy użyciu przeglądarki systemowej i brokera, dodaj następującą sekcję, aby AndroidManifest.xml:
<!-- 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>
Zastąp {Package Name}
ciąg nazwą pakietu aplikacji.
Zaktualizowany manifest, który zawiera teraz obsługę przeglądarki systemowej i uwierzytelniania obsługiwanego przez brokera, powinien wyglądać podobnie do następującego przykładu:
<?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>
Korzystanie z osadzonego widoku internetowego (opcjonalnie)
Domyślnie MSAL.NET używa systemowej przeglądarki internetowej. Ta przeglądarka umożliwia uzyskanie logowania jednokrotnego przy użyciu aplikacji internetowych i innych aplikacji. W niektórych rzadkich przypadkach system może chcieć użyć osadzonego widoku internetowego.
W tym przykładzie kodu pokazano, jak skonfigurować osadzony widok internetowy:
bool useEmbeddedWebView = !app.IsSystemWebViewAvailable;
var authResult = AcquireTokenInteractive(scopes)
.WithParentActivityOrWindow(parentActivity)
.WithEmbeddedWebView(useEmbeddedWebView)
.ExecuteAsync();
Aby uzyskać więcej informacji, zobacz Zagadnienia dotyczące korzystania z przeglądarek internetowych na potrzeby MSAL.NET i przeglądarki systemu Xamarin Android.
Rozwiązywanie problemów
Ogólne porady
- Zaktualizuj istniejący pakiet MSAL.NET NuGet do najnowszej wersji MSAL.NET.
- Sprawdź, czy zestaw narzędzi Xamarin.Forms jest w najnowszej wersji.
- Sprawdź, czy rozszerzenie Xamarin.Android.Support.v4 jest w najnowszej wersji.
- Upewnij się, że wszystkie pakiety Xamarin.Android.Support są przeznaczone dla najnowszej wersji.
- Wyczyść lub ponownie skompiluj aplikację.
- W programie Visual Studio spróbuj ustawić maksymalną liczbę kompilacji równoległych projektów na 1. W tym celu wybierz pozycję Opcje>Projekty i rozwiązania>Kompiluj i uruchamiaj>maksymalną liczbę kompilacji projektów równoległych.
- Jeśli tworzysz z wiersza polecenia, a polecenie używa
/m
polecenia , spróbuj usunąć ten element z polecenia .
Błąd: nazwa AuthenticationContinuationHelper nie istnieje w bieżącym kontekście
Jeśli błąd wskazuje, że AuthenticationContinuationHelper
nie istnieje w bieżącym kontekście, program Visual Studio mógł niepoprawnie zaktualizować plik Android.csproj* . Czasami ścieżka pliku w elemecie <HintPath>
niepoprawnie zawiera netstandard13
wartość zamiast monoandroid90
.
Ten przykład zawiera poprawną ścieżkę pliku:
<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>
Następne kroki
Aby wypróbować dodatkowe przykłady, publiczne aplikacje klienckie dla urządzeń przenośnych.