Konfigurationskrav och felsökningstips för Xamarin Android med MSAL.NET

Det finns flera konfigurationsändringar som du måste göra i koden när du använder Xamarin Android med Microsoft Authentication Library för .NET (MSAL.NET). I följande avsnitt beskrivs de nödvändiga ändringarna, följt av ett felsökningsavsnitt som hjälper dig att undvika några av de vanligaste problemen.

Ange den överordnade aktiviteten

På Xamarin Android anger du den överordnade aktiviteten så att token returneras efter interaktionen:

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

I MSAL.NET 4.2 och senare kan du också ange den här funktionen på nivån PublicClientApplication. Om du vill göra det använder du ett återanrop:

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

Om du använder CurrentActivityPlugin bör byggkoden PublicClientApplication se ut ungefär så här:

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

Se till att kontrollen återgår till MSAL

När den interaktiva delen av autentiseringsflödet slutar returnerar du kontrollen till MSAL genom att Activityåsidosätta .OnActivityResult() Metod.

I åsidosättningen anropar du MSAL. NET:s AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs() -metod för att returnera kontrollen till MSAL i slutet av den interaktiva delen av autentiseringsflödet.

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

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

Uppdatera Android-manifestet för System WebView-stöd

För att stödja System WebView ska AndroidManifest.xml-filen innehålla följande värden:

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

Värdet android:scheme skapas från den omdirigerings-URI som har konfigurerats i programportalen. Om din omdirigerings-URI till exempel är msal00001111-aaaa-2222-bbbb-3333cccc4444://authandroid:scheme ser posten i manifestet ut så här:

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

Du kan också skapa aktiviteten i koden i stället för att redigera AndroidManifest.xml manuellt. Skapa aktiviteten i koden genom att först skapa en klass som innehåller Activity attributet och attributet IntentFilter .

Här är ett exempel på en klass som representerar värdena för XML-filen:

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

Använda System WebView i asynkron autentisering

Om du vill använda System WebView som reserv för interaktiv autentisering när du har konfigurerat ditt program att använda asynkron autentisering och enheten inte har en asynkron autentisering installerad aktiverar du MSAL för att samla in autentiseringssvaret med hjälp av koordinatorns omdirigerings-URI. MSAL försöker autentisera med hjälp av standardsystemwebbvyn på enheten när den upptäcker att asynkron meddelandekö inte är tillgänglig. Med den här standardinställningen misslyckas den eftersom omdirigerings-URI:n är konfigurerad för att använda en asynkron meddelandekö, och System WebView vet inte hur den ska användas för att återgå till MSAL. Lös problemet genom att skapa ett avsiktsfilter med hjälp av URI:n för asynkron omdirigering som du konfigurerade tidigare. Lägg till avsiktsfiltret genom att ändra programmets manifest som det här exemplet:

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

Ersätt det paketnamn som du registrerade i Azure-portalen med värdet android:host= . Ersätt nyckelhashen som du registrerade i Azure-portalen med värdet android:path= . Signaturshash bör inte vara URL-kodad. Se till att ett inledande snedstreck (/) visas i början av din signaturhash.

Xamarin.Forms 4.3.x-manifest

Xamarin.Forms 4.3.x genererar kod som anger package attributet till com.companyname.{appName} i AndroidManifest.xml. Om du använder DataScheme som msal{client_id}kanske du vill ändra värdet så att det matchar värdet för MainActivity.cs namnområdet.

Stöd för Android 11

Om du vill använda systemwebbläsaren och asynkron autentisering i Android 11 måste du först deklarera dessa paket så att de visas för appen. Appar som riktar in sig på Android 10 (API 29) och tidigare kan fråga operativsystemet efter en lista över paket som är tillgängliga på enheten vid en viss tidpunkt. För att stödja sekretess och säkerhet minskar Android 11 paketsynligheten till en standardlista över OS-paket och de paket som anges i appens AndroidManifest.xml-fil .

Om du vill att programmet ska kunna autentiseras med hjälp av både systemwebbläsaren och asynkron meddelandekö lägger du till följande avsnitt i 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>

Ersätt {Package Name} med programpaketets namn.

Ditt uppdaterade manifest, som nu innehåller stöd för systemwebbläsaren och asynkron autentisering, bör se ut ungefär så här:

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

Använda den inbäddade webbvyn (valfritt)

Som standard använder MSAL.NET systemwebbläsaren. Med den här webbläsaren kan du få enkel inloggning (SSO) med hjälp av webbprogram och andra appar. I vissa sällsynta fall kanske du vill att systemet ska använda en inbäddad webbvy.

Det här kodexemplet visar hur du konfigurerar en inbäddad webbvy:

bool useEmbeddedWebView = !app.IsSystemWebViewAvailable;

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

Mer information finns i Använda webbläsare för MSAL.NET och Xamarin Android-systemöverväganden.

Felsökning

Allmänna tips

  • Uppdatera det befintliga MSAL.NET NuGet-paketet till den senaste versionen av MSAL.NET.
  • Kontrollera att Xamarin.Forms har den senaste versionen.
  • Kontrollera att Xamarin.Android.Support.v4 har den senaste versionen.
  • Se till att alla Xamarin.Android.Support-paket har den senaste versionen som mål.
  • Rensa eller återskapa programmet.
  • I Visual Studio kan du prova att ange det maximala antalet parallella projektversioner till 1. För att göra det väljer du Alternativ>Projekt och lösningar>Skapa och Kör>Maximalt antal parallella projektversioner.
  • Om du skapar från kommandoraden och kommandot använder kan /mdu prova att ta bort det här elementet från kommandot.

Fel: Namnet AuthenticationContinuationHelper finns inte i den aktuella kontexten

Om ett fel indikerar att AuthenticationContinuationHelper det inte finns i den aktuella kontexten kan Visual Studio ha uppdaterat Android.csproj*- filen felaktigt. Ibland innehåller netstandard13 filsökvägen i elementet <HintPath> felaktigt i stället för monoandroid90.

Det här exemplet innehåller en korrekt filsökväg:

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

Nästa steg

Mer information finns i exemplet på ett Xamarin-mobilprogram som använder Microsofts identitetsplattform. I följande tabell sammanfattas relevant information i README-filen.

Exempel Plattform beskrivning
https://github.com/Azure-Samples/active-directory-xamarin-native-v2 Xamarin.iOS, Android, UWP Ett Xamarin-mobilprogram som visar hur du använder MSAL.NET för att autentisera arbets- eller skolkonton och Personliga Microsoft-konton med Microsofts identitetsplattform och få åtkomst till Microsoft Graph API med den resulterande token.
Diagram över autentiseringsflöde