Authentifizierung von Benutzern mit Azure Active Directory B2C

Download Sample Das Beispiel herunterladen

Azure Active Directory B2C bietet die Cloud-Identitätsverwaltung für verbraucherbezogene Web- und mobile Anwendungen. In diesem Artikel wird gezeigt, wie Sie Azure Active Directory B2C verwenden, um die Identitätsverwaltung in eine mobile Anwendung mit der Microsoft-Authentifizierungsbibliothek zu integrieren.

Überblick

Azure Active Directory B2C (ADB2C) ist ein Identitätsverwaltungsdienst für Verbraucheranwendungen. Es ermöglicht Benutzern, sich mit ihren vorhandenen sozialen Konten oder benutzerdefinierten Anmeldeinformationen wie E-Mail oder Benutzername und Kennwort bei Ihrer Anwendung anzumelden. Benutzerdefinierte Anmeldeinformationenkonten werden als lokale Konten bezeichnet.

Der Prozess zum Integrieren des Azure Active Directory B2C-Identitätsverwaltungsdiensts in eine mobile Anwendung lautet wie folgt:

  1. Erstellen eines Azure Active Directory B2C-Mandanten
  2. Registrieren Sie Ihre mobile Anwendung mit dem Azure Active Directory B2C-Mandanten.
  3. Erstellen Sie Richtlinien zum Registrieren und Anmelden, und vergessen Sie Kennwortbenutzerflüsse.
  4. Verwenden Sie die Microsoft Authentication Library (MSAL), um einen Authentifizierungsworkflow mit Ihrem Azure Active Directory B2C-Mandanten zu starten.

Hinweis

Wenn Sie kein Azure-Abonnement besitzen, erstellen Sie ein kostenloses Konto, bevor Sie beginnen.

Azure Active Directory B2C unterstützt mehrere Identitätsanbieter wie Microsoft, GitHub, Facebook, Twitter und mehr. Weitere Informationen zu Azure Active Directory B2C-Funktionen finden Sie in Azure Active Directory B2C-Dokumentation.

Microsoft Authentication Library unterstützt mehrere Anwendungsarchitekturen und Plattformen. Informationen zu MSAL-Funktionen finden Sie unter Microsoft Authentication Library unter GitHub.

Konfigurieren eines Azure Active Directory B2C-Mandanten

Um das Beispielprojekt auszuführen, müssen Sie einen Azure Active Directory B2C-Mandanten erstellen. Weitere Informationen finden Sie unter Erstellen eines Azure Active Directory B2C-Mandanten im Azure-Portal.

Nachdem Sie einen Mandanten erstellt haben, benötigen Sie den Mandantennamen und die Mandanten-ID , um die mobile Anwendung zu konfigurieren. Die Mandanten-ID und der Name werden durch die Domäne definiert, die beim Erstellen Ihrer Mandanten-URL generiert wird. Wenn Ihre generierte Mandanten-URL die Mandanten-IDcontoso20190410tenant.onmicrosoft.com ist https://contoso20190410tenant.onmicrosoft.com/ und der Mandantenname lautetcontoso20190410tenant. Suchen Sie die Mandantendomäne im Azure-Portal, indem Sie im oberen Menü auf das Verzeichnis und den Abonnementfilter klicken. Der folgende Screenshot zeigt die Schaltfläche "Azure-Verzeichnis" und "Abonnementfilter" und die Mandantendomäne:

Tenant name in the Azure directory and subscription filter view

Bearbeiten Sie im Beispielprojekt die Datei "Constants.cs ", um die tenantNametenantId Felder festzulegen. Der folgende Code zeigt, wie diese Werte festgelegt werden sollen, wenn Ihre Mandantendomäne ist https://contoso20190410tenant.onmicrosoft.com/, ersetzen Sie diese Werte durch Werte aus Ihrem Portal:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    ...
}

Registrieren Ihrer mobilen Anwendung mit Azure Active Directory B2C

Eine mobile Anwendung muss mit dem Mandanten registriert werden, bevor benutzer verbunden und authentifiziert werden können. Der Registrierungsprozess weist der Anwendung eine eindeutige Anwendungs-ID zu, und eine Umleitungs-URL , die Antworten zurück an die Anwendung nach der Authentifizierung leitet. Weitere Informationen finden Sie unter Azure Active Directory B2C: Registrieren Sie Ihre Anwendung. Sie müssen die Anwendungs-ID kennen, die Ihrer Anwendung zugewiesen ist, die nach dem Anwendungsnamen in der Eigenschaftenansicht aufgeführt ist. Im folgenden Screenshot wird gezeigt, wo die Anwendungs-ID gefunden werden soll:

Application ID in the Azure application properties view

Die Microsoft-Authentifizierungsbibliothek erwartet die Umleitungs-URL für Ihre Anwendung als Präfix mit dem Text "msal" und gefolgt von einem Endpunkt namens "auth". Wenn Ihre Anwendungs-ID "1234abcd" ist, sollte die vollständige URL sein msal1234abcd://auth. Stellen Sie sicher, dass Ihre Anwendung die Native Clienteinstellung aktiviert und einen benutzerdefinierten Umleitungs-URI mit Ihrer Anwendungs-ID erstellt hat, wie im folgenden Screenshot dargestellt:

Custom Redirect URI in the Azure application properties view

Die URL wird später sowohl in android ApplicationManifest.xml als auch in der iOS Info.plist verwendet.

Bearbeiten Sie im Beispielprojekt die Datei "Constants.cs ", um das clientId Feld auf Ihre Anwendungs-ID festzulegen. Der folgende Code zeigt, wie dieser Wert festgelegt werden soll, wenn ihre Anwendungs-ID 1234abcdlautet:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    ...
}

Erstellen von Anmelde- und Anmelderichtlinien und Vergessen von Kennwortrichtlinien

Eine Richtlinie ist eine Benutzeroberfläche, die Benutzer durchlaufen, um eine Aufgabe abzuschließen, z. B. das Erstellen eines Kontos oder das Zurücksetzen eines Kennworts. Eine Richtlinie gibt auch den Inhalt von Token an, die die Anwendung empfängt, wenn der Benutzer von der Oberfläche zurückgibt. Sie müssen Richtlinien für die Anmeldung und Anmeldung des Kontos einrichten und das Kennwort zurücksetzen. Azure verfügt über integrierte Richtlinien, die die Erstellung gemeinsamer Richtlinien vereinfachen. Weitere Informationen finden Sie unter Azure Active Directory B2C: Integrierte Richtlinien.

Wenn Sie die Richtlinieneinrichtung abgeschlossen haben, sollten Sie zwei Richtlinien in der Ansicht "Benutzerflüsse" (Richtlinien) in der Azure-Portal haben. Im folgenden Screenshot werden zwei konfigurierte Richtlinien im Azure-Portal veranschaulicht:

Two configured policies in the Azure User flows (policies) view

Bearbeiten Sie im Beispielprojekt die Datei "Constants.cs ", um die policySigninpolicyPassword namen festzulegen, die Sie während der Richtlinieneinrichtung ausgewählt haben:

public static class Constants
{
    static readonly string tenantName = "contoso20190410tenant";
    static readonly string tenantId = "contoso20190410tenant.onmicrosoft.com";
    static readonly string clientId = "1234abcd";
    static readonly string policySignin = "B2C_1_signupsignin1";
    static readonly string policyPassword = "B2C_1_passwordreset";
    ...
}

Verwenden der Microsoft-Authentifizierungsbibliothek (MSAL) für die Authentifizierung

Das Microsoft Authentication Library (MSAL)-NuGet-Paket muss dem freigegebenen, .NET Standard-Projekt und den Plattformprojekten in einer Xamarin.Forms Lösung hinzugefügt werden. MSAL enthält eine PublicClientApplicationBuilder Klasse, die ein Objekt an die IPublicClientApplication Schnittstelle angibt. MSAL verwendet With Klauseln, um zusätzliche Parameter für den Konstruktor und die Authentifizierungsmethoden bereitzustellen.

Im Beispielprojekt definiert der Codebehind für App.xaml statische Eigenschaften namens AuthenticationClient und UIParentinstanziiert das AuthenticationClient Objekt im Konstruktor. Die WithIosKeychainSecurityGroup Klausel stellt einen Sicherheitsgruppennamen für iOS-Anwendungen bereit. Die WithB2CAuthority Klausel stellt die Standardbehörde oder Richtlinie bereit, die zum Authentifizieren von Benutzern verwendet wird. Die WithRedirectUri Klausel teilt der Azure Notification Hubs-Instanz mit, welche Umleitungs-URI verwendet werden soll, wenn mehrere URIs angegeben werden. Im folgenden Beispiel wird veranschaulicht, wie sie das Instanziieren des PublicClientApplicationFolgenden veranschaulicht:

public partial class App : Application
{
    public static IPublicClientApplication AuthenticationClient { get; private set; }

    public static object UIParent { get; set; } = null;

    public App()
    {
        InitializeComponent();

        AuthenticationClient = PublicClientApplicationBuilder.Create(Constants.ClientId)
            .WithIosKeychainSecurityGroup(Constants.IosKeychainSecurityGroups)
            .WithB2CAuthority(Constants.AuthoritySignin)
            .WithRedirectUri($"msal{Constants.ClientId}://auth")
            .Build();

        MainPage = new NavigationPage(new LoginPage());
    }

    ...

Hinweis

Wenn Ihre Azure Notification Hubs-Instanz nur einen Umleitungs-URI definiert hat, kann die AuthenticationClient Instanz funktionieren, ohne den Umleitungs-URI mit der WithRedirectUri Klausel anzugeben. Sie sollten diesen Wert jedoch immer angeben, wenn ihre Azure-Konfiguration erweitert wird, um andere Clients oder Authentifizierungsmethoden zu unterstützen.

Der OnAppearing Ereignishandler im LoginPage.xaml.cs-Code hinter Aufrufen AcquireTokenSilentAsync , um das Authentifizierungstoken für Benutzer zu aktualisieren, die sich zuvor angemeldet haben. Der Authentifizierungsprozess leitet an den LogoutPage erfolgreichen Vorgang um und führt nichts zum Fehler aus. Im folgenden Beispiel wird der automatische Reauthentication-Prozess in OnAppearing:

public partial class LoginPage : ContentPage
{
    ...

    protected override async void OnAppearing()
    {
        try
        {
            // Look for existing account
            IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

            AuthenticationResult result = await App.AuthenticationClient
                .AcquireTokenSilent(Constants.Scopes, accounts.FirstOrDefault())
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch
        {
            // Do nothing - the user isn't logged in
        }
        base.OnAppearing();
    }

    ...
}

Der Ereignishandler (ausgelöst, wenn die OnLoginButtonClicked Schaltfläche "Anmelden" geklickt wird) ruft AcquireTokenAsyncauf. Die MSAL-Bibliothek öffnet automatisch den Browser für mobile Geräte und navigiert zur Anmeldeseite. Die Anmelde-URL, die als Autorität bezeichnet wird, ist eine Kombination aus dem Mandantennamen und den Richtlinien, die in der Datei "Constants.cs " definiert sind. Wenn der Benutzer die Vergessene Kennwortoption wählt, werden sie mit Ausnahme an die App zurückgegeben, die die vergessene Kennworterfahrung startet. Das folgende Beispiel zeigt den Authentifizierungsprozess:

public partial class LoginPage : ContentPage
{
    ...

    async void OnLoginButtonClicked(object sender, EventArgs e)
    {
        AuthenticationResult result;
        try
        {
            result = await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .ExecuteAsync();

            await Navigation.PushAsync(new LogoutPage(result));
        }
        catch (MsalException ex)
        {
            if (ex.Message != null && ex.Message.Contains("AADB2C90118"))
            {
                result = await OnForgotPassword();
                await Navigation.PushAsync(new LogoutPage(result));
            }
            else if (ex.ErrorCode != "authentication_canceled")
            {
                await DisplayAlert("An error has occurred", "Exception message: " + ex.Message, "Dismiss");
            }
        }
    }

    ...
}

Die OnForgotPassword Methode ähnelt dem Anmeldeprozess, implementiert jedoch eine benutzerdefinierte Richtlinie. OnForgotPassword verwendet eine andere Überladung von AcquireTokenAsync, mit der Sie eine bestimmte Behörde bereitstellen können. Im folgenden Beispiel wird gezeigt, wie Eine benutzerdefinierte Behörde beim Abrufen eines Token bereitgestellt wird:

public partial class LoginPage : ContentPage
{
    ...
    async Task<AuthenticationResult> OnForgotPassword()
    {
        try
        {
            return await App.AuthenticationClient
                .AcquireTokenInteractive(Constants.Scopes)
                .WithPrompt(Prompt.SelectAccount)
                .WithParentActivityOrWindow(App.UIParent)
                .WithB2CAuthority(Constants.AuthorityPasswordReset)
                .ExecuteAsync();
        }
        catch (MsalException)
        {
            // Do nothing - ErrorCode will be displayed in OnLoginButtonClicked
            return null;
        }
    }
}

Der letzte Teil der Authentifizierung ist der Abmeldevorgang. Die OnLogoutButtonClicked Methode wird aufgerufen, wenn der Benutzer die Schaltfläche "Abmelden" drückt. Sie durchläuft alle Konten und stellt sicher, dass ihre Token ungültig wurden. Im folgenden Beispiel wird die Abmeldeimplementierung veranschaulicht:

public partial class LogoutPage : ContentPage
{
    ...
    async void OnLogoutButtonClicked(object sender, EventArgs e)
    {
        IEnumerable<IAccount> accounts = await App.AuthenticationClient.GetAccountsAsync();

        while (accounts.Any())
        {
            await App.AuthenticationClient.RemoveAsync(accounts.First());
            accounts = await App.AuthenticationClient.GetAccountsAsync();
        }

        await Navigation.PopAsync();
    }
}

iOS

Bei iOS muss das benutzerdefinierte URL-Schema, das mit Azure Active Directory B2C registriert wurde, in Info.plist registriert werden. MSAL erwartet, dass das URL-Schema einem bestimmten Muster entspricht, das zuvor in "Registrieren Ihrer mobilen Anwendung" mit Azure Active Directory B2C beschrieben wurde. Der folgende Screenshot zeigt das benutzerdefinierte URL-Schema in Info.plist.

MSAL erfordert auch Keychain-Berechtigungen auf iOS, die in der Entitilements.plist registriert sind, wie im folgenden Screenshot dargestellt:

Wenn Azure Active Directory B2C die Autorisierungsanforderung abgeschlossen hat, leitet sie zur registrierten Umleitungs-URL um. Das benutzerdefinierte URL-Schema führt dazu, dass iOS die mobile Anwendung startet und die URL als Startparameter übergeben wird, wobei es durch die OpenUrl Außerkraftsetzung der Klasse der Anwendung AppDelegate verarbeitet wird und die Kontrolle über die Benutzeroberfläche an MSAL zurückgibt. Die OpenUrl Implementierung wird im folgenden Codebeispiel gezeigt:

using Microsoft.Identity.Client;

namespace TodoAzure.iOS
{
    [Register("AppDelegate")]
    public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
    {
        ...
        public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
        {
            AuthenticationContinuationHelper.SetAuthenticationContinuationEventArgs(url);
            return base.OpenUrl(app, url, options);
        }
    }
}

Android

Unter Android muss das benutzerdefinierte URL-Schema, das mit Azure Active Directory B2C registriert wurde, im AndroidManifest.xmlregistriert werden. MSAL erwartet, dass das URL-Schema einem bestimmten Muster entspricht, das zuvor in "Registrieren Ihrer mobilen Anwendung" mit Azure Active Directory B2C beschrieben wurde. Im folgenden Beispiel wird das benutzerdefinierte URL-Schema im AndroidManifest.xmldargestellt.

<?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.xamarin.adb2cauthorization">
  <uses-sdk android:minSdkVersion="15" />
  <application android:label="ADB2CAuthorization">
    <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" />
        <!-- example -->
        <!-- <data android:scheme="msalaaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" android:host="auth" /> -->
        <data android:scheme="INSERT_URI_SCHEME_HERE" android:host="auth" />
      </intent-filter>
    </activity>"
  </application>
</manifest>

Die MainActivity Klasse muss geändert werden, um das UIParent Objekt während des Aufrufs OnCreate an die Anwendung bereitzustellen. Wenn Azure Active Directory B2C die Autorisierungsanforderung abgeschlossen hat, wird sie vonAndroidManifest.xmlan das registrierte URL-Schema umgeleitet. Das registrierte URI-Schema führt dazu, dass Android die OnActivityResult Methode mit der URL als Startparameter aufruft, wobei er von der SetAuthenticationContinuationEventArgs Methode verarbeitet wird.

public class MainActivity : FormsAppCompatActivity
{
    protected override void OnCreate(Bundle bundle)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(bundle);

        Forms.Init(this, bundle);
        LoadApplication(new App());
        App.UIParent = this;
    }

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

Universelle Windows-Plattform

Es ist kein zusätzlicher Setup erforderlich, MSAL auf dem Universelle Windows-Plattform zu verwenden.

Ausführen des Projekts

Führen Sie die Anwendung auf einem virtuellen oder physischen Gerät aus. Wenn Sie auf die Schaltfläche "Anmeldung " tippen, sollten Sie den Browser öffnen und zu einer Seite navigieren, auf der Sie sich anmelden oder ein Konto erstellen können. Nach Abschluss des Anmeldevorgangs sollten Sie zur Anmeldeseite der Anwendung zurückgegeben werden. Der folgende Screenshot zeigt den Benutzeranmeldungsbildschirm, der auf Android und iOS ausgeführt wird: