Udostępnij za pośrednictwem


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 wersji MSAL.NET 4.2 lub nowszej można również ustawić tę funkcję na poziomie elementu 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, PublicClientApplication kod konstruktora 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 wróć do biblioteki MSAL, przesłaniając Activityelement .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 /mpolecenia , 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 uzyskać więcej informacji, zobacz przykład aplikacji mobilnej platformy Xamarin, która używa Platforma tożsamości Microsoft. Poniższa tabela zawiera podsumowanie odpowiednich informacji w pliku README.

Przykład Platforma opis
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin.iOS, Android, UWP Aplikacja mobilna platformy Xamarin, która pokazuje, jak używać MSAL.NET do uwierzytelniania kont służbowych i osobistych Microsoft przy użyciu Platforma tożsamości Microsoft oraz uzyskiwania dostępu do interfejsu API programu Microsoft Graph przy użyciu wynikowego tokenu.
Diagram przepływu uwierzytelniania