Authentifizierung von Benutzern mit Azure Active Directory B2C
Azure Active Directory B2C bietet Cloud Identity Management für verbraucherorientierte Web- und mobile Anwendungen. In diesem Artikel wird gezeigt, wie Sie Azure Active Directory B2C verwenden, um die Identitätsverwaltung in eine mobile Anwendung in die Microsoft-Authentifizierungsbibliothek zu integrieren.
Übersicht
Azure Active Directory B2C (ADB2C) ist ein Identitätsverwaltungsdienst für Verbraucheranwendungen. Benutzer können sich mit ihren vorhandenen Konten für soziale Netzwerke oder benutzerdefinierte Anmeldeinformationen wie E-Mail oder Benutzername und Kennwort bei Ihrer Anwendung anmelden. Benutzerdefinierte Anmeldeinformationskonten werden als lokale Konten bezeichnet.
Der Prozess für die Integration des Azure Active Directory B2C-Identitätsverwaltungsdiensts in eine mobile Anwendung lautet wie folgt:
- Erstellen eines Azure Active Directory B2C-Mandanten
- Registrieren Sie Ihre mobile Anwendung beim Azure Active Directory B2C-Mandanten.
- Erstellen Sie Richtlinien für die Registrierung und Anmeldung, und vergessen Sie Kennwortbenutzerflüsse.
- 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, einschließlich Microsoft, GitHub, Facebook, Twitter und mehr. Weitere Informationen zu Azure Active Directory B2C-Funktionen finden Sie in der Azure Active Directory B2C-Dokumentation.
Die Microsoft-Authentifizierungsbibliothek unterstützt mehrere Anwendungsarchitekturen und -plattformen. Informationen zu MSAL-Funktionen finden Sie in der Microsoft-Authentifizierungsbibliothek 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 durch die do Standard definiert, die beim Erstellen Der Mandanten-URL generiert wurde. Wenn Ihre generierte Mandanten-URL die Mandanten-ID ist https://contoso20190410tenant.onmicrosoft.com/
contoso20190410tenant.onmicrosoft.com
und der Mandantname lautetcontoso20190410tenant
. Suchen Sie den Mandanten Standard im Azure-Portal, indem Sie im oberen Menü auf den Verzeichnis- und Abonnementfilter klicken. Der folgende Screenshot zeigt die Azure-Verzeichnis- und Abonnementfilterschaltfläche und den Mandanten Standard:
Bearbeiten Sie im Beispielprojekt die Constants.cs Datei, um die tenantName
Felder tenantId
festzulegen. Der folgende Code zeigt, wie diese Werte festgelegt werden sollten, wenn Ihr Mandant dies tut Standard 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 bei Azure Active Directory B2C
Eine mobile Anwendung muss beim 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 nach der Authentifizierung zurück an die Anwendung weiterleitet. Weitere Informationen finden Sie unter Azure Active Directory B2C: Registrieren Ihrer Anwendung. Sie müssen die Anwendungs-ID kennen, die Ihrer Anwendung zugewiesen ist, die nach dem Anwendungsnamen in der Eigenschaftenansicht aufgeführt ist. Der folgende Screenshot zeigt, wo sie die Anwendungs-ID finden:
Die Microsoft-Authentifizierungsbibliothek erwartet, dass die Umleitungs-URL für Ihre Anwendung Ihre Anwendungs-ID mit dem Text "msal" und gefolgt von einem Endpunkt namens "Authentifizierung" ist. Wenn Ihre Anwendungs-ID "1234abcd" lautet, sollte die vollständige URL sein msal1234abcd://auth
. Stellen Sie sicher, dass Ihre Anwendung die Native Client-Einstellung aktiviert und einen benutzerdefinierten Umleitungs-URI mit Ihrer Anwendungs-ID erstellt hat, wie im folgenden Screenshot gezeigt:
Die URL wird später sowohl in der Android-ApplicationManifest.xml als auch in der iOS Info.plist verwendet.
Bearbeiten Sie im Beispielprojekt die Constants.cs Datei, 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ückgibt. 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 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)" im Azure-Portal haben. Der folgende Screenshot zeigt zwei konfigurierte Richtlinien im Azure-Portal:
Bearbeiten Sie im Beispielprojekt die Constants.cs Datei, um die Namen policyPassword
festzulegen, die policySignin
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 NuGet-Paket (Microsoft Authentication Library, MSAL) muss dem freigegebenen Projekt .NET Standard und den Plattformprojekten in einer Xamarin.Forms Lösung hinzugefügt werden. MSAL enthält eine PublicClientApplicationBuilder
Klasse, die ein Objekt erstellt, das der IPublicClientApplication
Schnittstelle entspricht. MSAL verwendet With
Klauseln, um zusätzliche Parameter für die Konstruktor- und Authentifizierungsmethoden bereitzustellen.
Im Beispielprojekt definiert der CodeBehind für "App.xaml " statische Eigenschaften namens AuthenticationClient
und UIParent
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 der Azure Notification Hubs-Instanz mit, welche Umleitungs-URI verwendet werden soll, wenn mehrere URIs angegeben sind. Das folgende Beispiel veranschaulicht, wie die Instanziierung der 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 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, falls Ihre Azure-Konfiguration erweitert wird, um andere Clients oder Authentifizierungsmethoden zu unterstützen.
Der OnAppearing
Ereignishandler im LoginPage.xaml.cs CodeBehind-Aufrufe AcquireTokenSilentAsync
, um das Authentifizierungstoken für Benutzer zu aktualisieren, die sich zuvor angemeldet haben. Der Authentifizierungsprozess wird bei erfolgreicher Ausführung an den LogoutPage
Fehler umgeleitet. 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 "Anmelden" geklickt wird) wird aufgerufen 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 Constants.cs Datei definiert sind. Wenn der Benutzer die Option "Kennwort vergessen" auswähelt, wird er mit einer 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 aber eine benutzerdefinierte Richtlinie. OnForgotPassword
verwendet eine andere Überladung von AcquireTokenAsync
, mit der Sie eine bestimmte Behörde bereitstellen können. Das folgende Beispiel zeigt, wie sie beim Abrufen eines Tokens eine benutzerdefinierte Autorität bereitstellen:
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 Abmeldungsprozess. Die OnLogoutButtonClicked
Methode wird aufgerufen, wenn der Benutzer die Abmeldeschaltfläche drückt. Sie durchläuft alle Konten und stellt sicher, dass ihre Token ungültig wurden. Im folgenden Beispiel wird die Abmeldungsimplementierung 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 Schlüsselbundberechtigungen unter iOS, die in der Liste "Entitilements.plist" registriert sind, wie im folgenden Screenshot gezeigt:
Wenn Azure Active Directory B2C die Autorisierungsanforderung abschließt, wird sie 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 es von der OpenUrl
Außerkraftsetzung der Klasse der Anwendung AppDelegate
verarbeitet wird, und gibt die Kontrolle über die Oberflä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.xml 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. 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 OnCreate
Aufrufs der Anwendung bereitzustellen. Wenn Azure Active Directory B2C die Autorisierungsanforderung abschließt, wird sie vom AndroidManifest.xml an das registrierte URL-Schema umgeleitet. Das registrierte URI-Schema führt dazu, dass Android die Methode mit der OnActivityResult
URL als Startparameter aufruft, wobei es 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
Für die Verwendung von MSAL auf dem Universelle Windows-Plattform ist kein zusätzliches Setup erforderlich.
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 Anmeldeseite der Anwendung zurückkehren. Der folgende Screenshot zeigt den Benutzeranmeldungsbildschirm unter Android und iOS: