Authentifizierung von Benutzern mit Azure Active Directory B2C

Beispiel herunterladen Das Beispiel herunterladen

Azure Active Directory B2C bietet cloudbasierte Identitätsverwaltung für benutzerseitige Web- und mobile Anwendungen. In diesem Artikel erfahren Sie, wie Sie Mithilfe von Azure Active Directory B2C die Identitätsverwaltung in eine mobile Anwendung mit der Microsoft-Authentifizierungsbibliothek integrieren.

Übersicht

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

Der Prozess für die Integration des Azure Active Directory B2C-Identitätsverwaltungsdiensts in eine mobile Anwendung sieht wie folgt aus:

  1. Erstellen eines Azure Active Directory B2C-Mandanten
  2. Registrieren Sie Ihre mobile Anwendung beim Azure Active Directory B2C-Mandanten.
  3. Erstellen Sie Richtlinien für die Registrierung und Anmeldung, und vergessen Sie Kennwortbenutzerflows.
  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, darunter Microsoft, GitHub, Facebook, Twitter und mehr. Weitere Informationen zu Azure Active Directory B2C-Funktionen finden Sie in der Dokumentation zu Azure Active Directory B2C.

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

Konfigurieren eines Azure Active Directory B2C-Mandanten

Zum Ausführen des Beispielprojekts 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 von der Domäne definiert, die beim Erstellen Der Mandanten-URL generiert wurde. Wenn Ihre generierte Mandanten-URL https://contoso20190410tenant.onmicrosoft.com/ die Mandanten-ID und contoso20190410tenant.onmicrosoft.com der Mandantenname lautet contoso20190410tenant. Suchen Sie die Mandantendomäne im Azure-Portal, indem Sie im oberen Menü auf den Verzeichnis- und Abonnementfilter klicken. Der folgende Screenshot zeigt die Schaltfläche "Azure-Verzeichnis- und Abonnementfilter" und die Mandantendomäne:

Mandantenname in der Azure-Verzeichnis- und Abonnementfilteransicht

Bearbeiten Sie im Beispielprojekt die Datei Constants.cs , um die tenantName Felder und tenantId festzulegen. Der folgende Code zeigt, wie diese Werte festgelegt werden sollen, wenn Ihre Mandantendomäne lautet 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 bei Azure Active Directory B2C

Eine mobile Anwendung muss beim Mandanten registriert werden, bevor sie eine Verbindung herstellen und Benutzer authentifizieren kann. Der Registrierungsprozess weist der Anwendung eine eindeutige Anwendungs-ID und eine Umleitungs-URL zu, die Antworten nach der Authentifizierung an die Anwendung zurückleitet. Weitere Informationen finden Sie unter Azure Active Directory B2C: Registrieren Ihrer Anwendung. Sie müssen die Ihrer Anwendung zugewiesene Anwendungs-ID kennen, die nach dem Anwendungsnamen in der Eigenschaftenansicht aufgeführt ist. Der folgende Screenshot zeigt, wo Die Anwendungs-ID zu finden ist:

Anwendungs-ID in der Eigenschaftenansicht der Azure-Anwendung

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

Benutzerdefinierter Umleitungs-URI in der Eigenschaftenansicht der Azure-Anwendung

Die URL wird später sowohl in der 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 lautet 1234abcd:

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

Erstellen von Registrierungs- und Anmelderichtlinien und Vergessen von Kennwortrichtlinien

Eine Richtlinie ist eine Erfahrung, die Benutzer durchlaufen, um eine Aufgabe auszuführen, 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ückkehrt. Sie müssen Richtlinien sowohl für die Kontoanmeldung als auch für die Anmeldung einrichten und das Kennwort zurücksetzen. Azure verfügt über integrierte Richtlinien, die die Erstellung allgemeiner Richtlinien vereinfachen. Weitere Informationen finden Sie unter Azure Active Directory B2C: Integrierte Richtlinien.

Wenn Sie die Richtlinieneinrichtung abgeschlossen haben, sollten in der Ansicht Benutzerflows (Richtlinien) im Azure-Portal zwei Richtlinien vorhanden sein. Der folgende Screenshot zeigt zwei konfigurierte Richtlinien im Azure-Portal:

Zwei konfigurierte Richtlinien in der Ansicht Azure-Benutzerflows (Richtlinien)

Bearbeiten Sie im Beispielprojekt die Datei Constants.cs , um die policySignin Felder und policyPassword so festzulegen, dass sie die Namen widerspiegeln, 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 Authentication Library (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 Projektmappe hinzugefügt werden. MSAL enthält eine PublicClientApplicationBuilder Klasse, die ein Objekt erstellt, das der IPublicClientApplication Schnittstelle entspricht. MSAL verwendet Klauseln With , um dem Konstruktor und den Authentifizierungsmethoden zusätzliche Parameter zur Verfügung zu stellen.

Im Beispielprojekt definiert der Code Behind für App.xaml statische Eigenschaften namens AuthenticationClient und UIParentund instanziiert das AuthenticationClient Objekt im Konstruktor. Die WithIosKeychainSecurityGroup -Klausel stellt einen Sicherheitsgruppennamen für iOS-Anwendungen bereit. Die WithB2CAuthority -Klausel stellt die Standardautorität oder -richtlinie bereit, die zum Authentifizieren von Benutzern verwendet wird. Die WithRedirectUri -Klausel teilt azure Notification Hubs instance, welcher Umleitungs-URI verwendet werden soll, wenn mehrere URIs angegeben werden. Im folgenden Beispiel wird veranschaulicht, wie Sie instanziieren:PublicClientApplication

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 Für Ihre Azure Notification Hubs-instance nur ein Umleitungs-URI definiert ist, kann der AuthenticationClient instance funktionieren, ohne den Umleitungs-URI mit der WithRedirectUri -Klausel anzugeben. Sie sollten diesen Wert jedoch immer angeben, falls Ihre Azure-Konfiguration erweitert wird, um andere Clients oder Authentifizierungsmethoden zu unterstützen.

Der OnAppearing Ereignishandler im CodeBehind LoginPage.xaml.cs ruft auf AcquireTokenSilentAsync , um das Authentifizierungstoken für Benutzer zu aktualisieren, die sich zuvor angemeldet haben. Der Authentifizierungsprozess leitet an den um, wenn erfolgreich LogoutPage ist, und führt bei Einem Fehler nichts aus. Das folgende Beispiel zeigt den automatischen Erneutauthentifizierungsprozess 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 OnLoginButtonClicked Ereignishandler (ausgelöst, wenn auf die Schaltfläche Anmeldung geklickt wird) ruft auf AcquireTokenAsync. 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 Option Kennwort vergessen auswähelt, wird er mit einer Ausnahme an die App zurückgegeben, wodurch die Option Kennwort vergessen gestartet wird. 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 aber eine benutzerdefinierte Richtlinie. OnForgotPassword verwendet eine andere Überladung von AcquireTokenAsync, mit der Sie eine bestimmte Autorität angeben können. Das folgende Beispiel zeigt, wie beim Abrufen eines Tokens eine benutzerdefinierte Autorität angegeben 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 Abmeldeschaltfläche drückt. Es durchläuft alle Konten und stellt sicher, dass deren Token ungültig wurden. Im folgenden Beispiel wird die Implementierung des Abmeldens 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

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

MSAL erfordert auch Keychain-Berechtigungen unter iOS, die in der Datei "Entitilements.plist" registriert sind, wie im folgenden Screenshot gezeigt:

Wenn Azure Active Directory B2C die Autorisierungsanforderung abgeschlossen hat, wird an die registrierte Umleitungs-URL umgeleitet. Das benutzerdefinierte URL-Schema führt dazu, dass iOS die mobile Anwendung startet und die URL als Startparameter übergibt, wobei sie von der OpenUrl Außerkraftsetzung der Anwendungsklasse AppDelegate verarbeitet wird, und gibt die Steuerung der Benutzeroberfläche an MSAL zurück. 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 bei Azure Active Directory B2C registriert wurde, im AndroidManifest.xmlregistriert werden. MSAL erwartet, dass das URL-Schema einem bestimmten Muster entspricht, das zuvor unter Registrieren Ihrer mobilen Anwendung bei Azure Active Directory B2C beschrieben wurde. Das folgende Beispiel zeigt das benutzerdefinierte URL-Schema im AndroidManifest.xml.

<?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 für die OnCreate Anwendung bereitzustellen. Wenn Azure Active Directory B2C die Autorisierungsanforderung abgeschlossen hat, wird vom AndroidManifest.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 sie 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ätzliches Setup erforderlich, um MSAL auf dem Universelle Windows-Plattform

Ausführen des Projekts

Führen Sie die Anwendung auf einem virtuellen oder physischen Gerät aus. Durch Tippen auf die Schaltfläche Anmelden sollte der Browser geöffnet und zu einer Seite navigiert werden, auf der Sie sich anmelden oder ein Konto erstellen können. Nach Abschluss des Anmeldevorgangs sollten Sie zur Abmeldeseite der Anwendung zurückkehren. Der folgende Screenshot zeigt den Benutzeranmeldungsbildschirm, der unter Android und iOS ausgeführt wird: