Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: Mitarbeitermieter
Externe Mieter (weitere Informationen)
Dieses Lernprogramm ist der letzte Teil einer Reihe, in der das Erstellen eines Anmelde- und Abmeldecodes in der .NET Multi-Platform App UI (.NET MAUI)-Shell veranschaulicht und die App auf der Windows-Plattform ausgeführt wird. In Teil 1 dieser Reihe haben Sie eine .NET MAUI-Shell-App erstellt, msAL SDK-Unterstützung über MSAL-Hilfsklassen hinzugefügt, erforderliche Bibliotheken installiert und eine Bildressource enthalten. In diesem letzten Schritt wird veranschaulicht, wie Sie Anmelde- und Abmeldecode in der .NET MAUI-Shell hinzufügen und die App auf der Windows-Plattform ausführen.
In diesem Tutorial führen Sie Folgendes durch:
- Fügen Sie Anmelde- und Abmeldecode hinzu.
- Ändern Sie die App-Shell.
- Fügen Sie plattformspezifischen Code hinzu.
- Fügen Sie App-Einstellungen hinzu.
- Führen Sie die .NET MAUI-Shell-App aus, und testen Sie sie.
Voraussetzungen
Hinzufügen von Anmelde- und Abmeldecode
Die Benutzeroberfläche einer .NET MAUI-App wird aus Objekten erstellt, die den systemeigenen Steuerelementen jeder Zielplattform zugeordnet sind. Die Hauptsteuerelementgruppen zum Erstellen der Benutzeroberfläche einer .NET MAUI-App sind Seiten, Layouts und Ansichten.
Hauptansichtsseite hinzufügen
Die nächsten Schritte organisieren unseren Code so, dass der main view
Code definiert ist.
Löschen Sie MainPage.xaml und MainPage.xaml.cs aus Ihrem Projekt, sie werden nicht mehr benötigt. Suchen Sie im Bereich Projektmappen-Explorer den Eintrag für MainPage.xaml, klicken Sie mit der rechten Maustaste darauf, und wählen Sie Löschen aus.
Klicken Sie mit der rechten Maustaste auf das SignInMaui-Projekt, und wählen Sie "> hinzufügen" aus. Benennen Sie den Ordner "Ansichten".
Klicken Sie mit der rechten Maustaste auf die Ansichten.
Wählen Sie "Neues Element>" aus.
Wählen Sie in der Vorlagenliste .NET MAUI aus.
Wählen Sie die .NET MAUI ContentPage (XAML)- Vorlage aus. Nennen Sie die Datei "MainView.xaml".
Wählen Sie Hinzufügen aus.
Die Datei MainView.xaml wird in einem neuen Dokumenten-Tab geöffnet und zeigt das gesamte XAML-Markup an, das die Benutzeroberfläche der Seite repräsentiert. Ersetzen des XAML-Markups durch folgendes Markup:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="SignInMaui.Views.MainView" Title="Microsoft Entra External ID" > <Shell.BackButtonBehavior> <BackButtonBehavior IsVisible="False" IsEnabled="False" /> </Shell.BackButtonBehavior> <ScrollView> <VerticalStackLayout Spacing="25" Padding="30,0" VerticalOptions="Center"> <Image Source="external_id.png" SemanticProperties.Description="External ID" HeightRequest="200" HorizontalOptions="Center" /> <Label Text="CIAM" SemanticProperties.HeadingLevel="Level1" FontSize="26" HorizontalOptions="Center" /> <Label Text="MAUI sample" SemanticProperties.HeadingLevel="Level1" FontSize="26" HorizontalOptions="Center" /> <Button x:Name="SignInButton" Text="Sign In" SemanticProperties.Hint="Sign In" Clicked="OnSignInClicked" HorizontalOptions="Center" IsEnabled="False"/> </VerticalStackLayout> </ScrollView> </ContentPage>
Speichern Sie die Datei.
Lassen Sie uns die wichtigsten Teile der XAML-Steuerelemente auf der Seite aufgliedern:
<ContentPage>
ist das Stammobjekt für die MainView-Klasse.<VerticalStackLayout>
ist das untergeordnete Objekt der ContentPage. Dieses Layoutsteuerelement ordnet seine untergeordneten Elemente vertikal nacheinander an.<Image>
zeigt ein Bild an, in diesem Fall wird das azureactive_directory.png_ verwendet, das Sie zuvor heruntergeladen haben.<Label>
-Steuerelemente zeigen Text an.<Button>
kann vom Benutzer gedrückt werden, wodurch dasClicked
Ereignis ausgelöst wird. Sie können Code als Reaktion auf dasClicked
-Ereignis ausführen.Clicked="OnSignInClicked"
dasClicked
Ereignis der Schaltfläche wird demOnSignInClicked
Ereignishandler zugewiesen, der in der CodeBehind-Datei definiert wird. Sie erstellen diesen Code im nächsten Schritt.
Behandeln des OnSignInClicked-Ereignisses
Der nächste Schritt besteht darin, den Code für das Clicked
-Ereignis der Schaltfläche hinzuzufügen.
Erweitern Sie im Bereich Projektmappen-Explorer von Visual Studio die Datei MainView.xaml, um die CodeBehind-Datei MainView.xaml.cs anzuzeigen. Öffnen Sie die MainView.xaml.cs , und ersetzen Sie den Inhalt der Datei durch folgenden Code:
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using SignInMaui.MSALClient; using Microsoft.Identity.Client; namespace SignInMaui.Views { public partial class MainView : ContentPage { public MainView() { InitializeComponent(); IAccount cachedUserAccount = PublicClientSingleton.Instance.MSALClientHelper.FetchSignedInUserFromCache().Result; _ = Dispatcher.DispatchAsync(async () => { if (cachedUserAccount == null) { SignInButton.IsEnabled = true; } else { await Shell.Current.GoToAsync("claimsview"); } }); } private async void OnSignInClicked(object sender, EventArgs e) { await PublicClientSingleton.Instance.AcquireTokenSilentAsync(); await Shell.Current.GoToAsync("claimsview"); } protected override bool OnBackButtonPressed() { return true; } } }
Die MainView
Klasse ist eine Inhaltsseite, die für die Anzeige der Hauptansicht der App verantwortlich ist. Im Konstruktor ruft es das zwischengespeicherte Benutzerkonto mithilfe der MSALClientHelper
PublicClientSingleton
Instanz ab und aktiviert die Anmeldeschaltfläche, wenn kein zwischengespeichertes Benutzerkonto gefunden wird.
Wenn auf die Anmeldeschaltfläche geklickt wird, ruft sie die AcquireTokenSilentAsync
Methode auf, um ein Token still abzurufen, und navigiert dann mithilfe der claimsview
Methode zur Seite Shell.Current.GoToAsync
. Darüber hinaus wird die OnBackButtonPressed
Methode außer Kraft gesetzt, um true zurückzugeben, was angibt, dass die Zurück-Schaltfläche für diese Ansicht deaktiviert ist.
Ansichtsseite für Ansprüche hinzufügen
Die nächsten Schritte organisieren den Code so, dass die ClaimsView
Seite definiert ist. Auf der Seite werden die Ansprüche der Benutzenden angezeigt, die im ID-Token gefunden wurden.
Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf Ansichten.
Wählen Sie "Neues Element>" aus.
Wählen Sie in der Vorlagenliste .NET MAUI aus.
Wählen Sie die .NET MAUI ContentPage (XAML)- Vorlage aus. Nennen Sie die Datei ClaimsView.xaml.
Wählen Sie Hinzufügen aus.
Die Datei ClaimsView.xaml wird auf einer neuen Dokumentregisterkarte geöffnet, auf der das gesamte XAML-Markup angezeigt wird, das die Benutzeroberfläche der Seite darstellt. Ersetzen des XAML-Markups durch folgendes Markup:
<?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="SignInMaui.Views.ClaimsView" Title="ID Token View"> <Shell.BackButtonBehavior> <BackButtonBehavior IsVisible="False" IsEnabled="False" /> </Shell.BackButtonBehavior> <VerticalStackLayout> <Label Text="CIAM" FontSize="26" HorizontalOptions="Center" /> <Label Text="MAUI sample" FontSize="26" Padding="0,0,0,20" HorizontalOptions="Center" /> <Label Padding="0,20,0,0" VerticalOptions="Center" HorizontalOptions="Center" FontSize="18" Text="Claims found in ID token" /> <ListView ItemsSource="{Binding IdTokenClaims}" x:Name="Claims"> <ListView.ItemTemplate> <DataTemplate> <ViewCell> <Grid Padding="0, 0, 0, 0"> <Label Grid.Column="1" Text="{Binding}" HorizontalOptions="Center" /> </Grid> </ViewCell> </DataTemplate> </ListView.ItemTemplate> </ListView> <Button x:Name="SignOutButton" Text="Sign Out" HorizontalOptions="Center" Clicked="SignOutButton_Clicked" /> </VerticalStackLayout> </ContentPage>
Dieser XAML-Markupcode stellt das UI-Layout für eine Anspruchsansicht in einer .NET MAUI-App dar. Zunächst wird
ContentPage
mit einem Titel definiert und das Verhalten der Zurück-Schaltfläche deaktiviert.Innerhalb eines
VerticalStackLayout
gibt es mehrereLabel
-Elemente, die statischen Text anzeigen, gefolgt von einemListView
namensClaims
, der an eine Auflistung gebunden wird, dieIdTokenClaims
genannt wird, um die im ID-Token gefundenen Claims anzuzeigen. Jeder Anspruch wird in einerViewCell
mit einerDataTemplate
gerendert und als zentriertesLabel
innerhalb eines Rasters angezeigt.Schließlich befindet sich unten im Layout eine
Sign Out
Schaltfläche, die denSignOutButton_Clicked
Ereignishandler auslöst, wenn darauf geklickt wird.
Behandeln der ClaimsView-Daten
Der nächste Schritt besteht darin, den Code zum Behandeln ClaimsView
von Daten hinzuzufügen.
Erweitern Sie im Bereich Projektmappen-Explorer von Visual Studio die Datei ClaimsView.xaml, um die CodeBehind-Datei ClaimsView.xaml.cs anzuzeigen. Öffnen Sie die ClaimsView.xaml.cs , und ersetzen Sie den Inhalt der Datei durch folgenden Code:
using SignInMaui.MSALClient; using Microsoft.Identity.Client; namespace SignInMaui.Views; public partial class ClaimsView : ContentPage { public IEnumerable<string> IdTokenClaims { get; set; } = new string[] {"No claims found in ID token"}; public ClaimsView() { BindingContext = this; InitializeComponent(); _ = SetViewDataAsync(); } private async Task SetViewDataAsync() { try { _ = await PublicClientSingleton.Instance.AcquireTokenSilentAsync(); IdTokenClaims = PublicClientSingleton.Instance.MSALClientHelper.AuthResult.ClaimsPrincipal.Claims.Select(c => c.Value); Claims.ItemsSource = IdTokenClaims; } catch (MsalUiRequiredException) { await Shell.Current.GoToAsync("claimsview"); } } protected override bool OnBackButtonPressed() { return true; } private async void SignOutButton_Clicked(object sender, EventArgs e) { await PublicClientSingleton.Instance.SignOutAsync().ContinueWith((t) => { return Task.CompletedTask; }); await Shell.Current.GoToAsync("mainview"); } }
Der Code in ClaimsView.xaml.cs stellt den CodeBehind für eine Anspruchsansicht in einer .NET MAUI-App dar. Er importiert zuerst die erforderlichen Namespaces und definiert die
ClaimsView
-Klasse, dieContentPage
erweitert. DieIdTokenClaims
Eigenschaft ist eine Aufzählung von Zeichenfolgen, die zunächst auf eine einzelne Zeichenfolge festgelegt ist, die angibt, dass keine Ansprüche gefunden wurden.Der
ClaimsView
Konstruktor legt den Bindungskontext auf die aktuelle Instanz fest, initialisiert die Ansichtskomponenten und ruft dieSetViewDataAsync
Methode asynchron auf. DieSetViewDataAsync
-Methode versucht, im Hintergrund ein Token abzurufen, ruft die Ansprüche aus dem Authentifizierungsergebnis ab und legt dieIdTokenClaims
-Eigenschaft fest, um sie in derListView
mit dem NamenClaims
anzuzeigen. Wenn einMsalUiRequiredException
Ereignis auftritt, das angibt, dass die Benutzerinteraktion für die Authentifizierung erforderlich ist, navigiert die App zur Anspruchsansicht.Die
OnBackButtonPressed
-Methode setzt das Verhalten der Zurück-Schaltfläche außer Kraft, sodass immer true zurückgegeben wird und der Benutzer nicht aus dieser Ansicht zurückkehren kann. DerSignOutButton_Clicked
-Ereignishandler meldet Benutzer*innen mithilfe derPublicClientSingleton
-Instanz ab und navigiert anschließend zurmain view
.
Ändern der App-Shell
Die AppShell
Klasse definiert die visuelle Hierarchie einer App, das XAML-Markup, das beim Erstellen der Benutzeroberfläche der App verwendet wird. Aktualisieren Sie die AppShell
, um sie über die Views
zu informieren.
Doppelklicken Sie im
AppShell.xaml
auf die Datei, um den XAML-Editor zu öffnen. Ersetzen Sie das XAML-Markup durch den folgenden Code:<?xml version="1.0" encoding="UTF-8" ?> <Shell x:Class="SignInMaui.AppShell" xmlns="http://schemas.microsoft.com/dotnet/2021/maui" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" xmlns:local="clr-namespace:SignInMaui.Views" Shell.FlyoutBehavior="Disabled"> <ShellContent Title="Home" ContentTemplate="{DataTemplate local:MainView}" Route="MainPage" /> </Shell>
Der XAML-Code definiert eine
AppShell
Klasse, die das Flyoutverhalten deaktiviert und den Hauptinhalt auf einShellContent
Element mit einem TitelHome
und einer Inhaltsvorlage festlegt, die auf dieMainView
Klasse verweist.Erweitern Sie im Projektmappen-Explorer von Visual Studio die Datei AppShell.xaml, um die Code-Behind-Datei AppShell.xaml.cs anzuzeigen. Öffnen Sie die AppShell.xaml.cs , und ersetzen Sie den Inhalt der Datei durch folgenden Code:
// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. using SignInMaui.Views; namespace SignInMaui; public partial class AppShell : Shell { public AppShell() { InitializeComponent(); Routing.RegisterRoute("mainview", typeof(MainView)); Routing.RegisterRoute("claimsview", typeof(ClaimsView)); } }
Sie aktualisieren die
AppShell.xaml.cs
-Datei, um die erforderlichen Routenregistrierungen für dieMainView
undClaimsView
einzufügen. Durch Aufrufen derInitializeComponent()
Methode stellen Sie sicher, dass die Initialisierung derAppShell
Klasse erfolgt. DieRegisterRoute()
-Methode ordnet diemainview
- undclaimsview
-Routen ihren jeweiligen Ansichtstypen,MainView
undClaimsView
, zu.
Plattformspezifischen Code hinzufügen
Ein .NET MAUI-App-Projekt enthält einen Ordner "Platforms ", wobei jeder untergeordnete Ordner eine Plattform darstellt, auf die .NET MAUI abzielen kann. Um anwendungsspezifisches Verhalten bereitzustellen, das die Standardanwendungsklasse ergänzt, ändern Sie Platforms/Windows/App.xaml.cs
.
Ersetzen Sie den Inhalt der Datei durch folgenden Code:
using SignInMaui.MSALClient;
using Microsoft.Identity.Client;
using Microsoft.UI.Xaml;
// To learn more about WinUI, the WinUI project structure,
// and more about our project templates, see: http://aka.ms/winui-project-info.
namespace SignInMaui.WinUI;
/// <summary>
/// Provides application-specific behavior to supplement the default Application class.
/// </summary>
public partial class App : MauiWinUIApplication
{
/// <summary>
/// Initializes the singleton application object. This is the first line of authored code
/// executed, and as such is the logical equivalent of main() or WinMain().
/// </summary>
public App()
{
this.InitializeComponent();
// configure redirect URI for your application
PlatformConfig.Instance.RedirectUri = $"msal{PublicClientSingleton.Instance.MSALClientHelper.AzureAdConfig.ClientId}://auth";
// Initialize MSAL
IAccount existinguser = Task.Run(async () => await PublicClientSingleton.Instance.MSALClientHelper.InitializePublicClientAppAsync()).Result;
}
protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();
protected override void OnLaunched(LaunchActivatedEventArgs args)
{
base.OnLaunched(args);
var app = SignInMaui.App.Current;
PlatformConfig.Instance.ParentWindow = ((MauiWinUIWindow)app.Windows[0].Handler.PlatformView).WindowHandle;
}
}
Im Code konfigurieren Sie den Umleitungs-URI für die Anwendung, initialisieren die MSAL und legen dann das übergeordnete Fenster für die Anwendung fest. Darüber hinaus überschreiben Sie die OnLaunched
-Methode, um das Startereignis zu behandeln und das Handle für das übergeordnete Fenster abzurufen.
Hinzufügen von App-Einstellungen
Einstellungen ermöglichen die Trennung von Daten, die das Verhalten einer App aus dem Code konfigurieren, sodass das Verhalten geändert werden kann, ohne die App neu zu erstellen. MauiAppBuilder
bietet ConfigurationManager
, um Einstellungen in unserer .NET MAUI-App zu konfigurieren. Fügen wir die appsettings.json
Datei als EmbeddedResource
hinzu.
Führen Sie zum Erstellen von appsettings.json
die folgenden Schritte aus:
Klicken Sie im Projektmappen-Explorer von Visual Studio mit der rechten Maustaste auf das SignInMaui-Projekt und wählen Sie >>.
Wählen Sie web>JavaScript JSON-Konfigurationsdatei aus. Nennen Sie die Datei
appsettings.json
.Wählen Sie Hinzufügen aus.
appsettings.jsonauswählen
Legen Sie im Bereich Eigenschaften die Option Buildaktion auf Eingebettete Ressource fest.
Legen Sie im EigenschaftenbereichIn Ausgabeverzeichnis kopieren auf Immer kopieren fest.
Ersetzen Sie den Inhalt der
appsettings.json
Datei durch den folgenden Code:{ "AzureAd": { "Authority": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/", "ClientId": "Enter_the_Application_Id_Here", "CacheFileName": "msal_cache.txt", "CacheDir": "C:/temp" }, "DownstreamApi": { "Scopes": "openid offline_access" } }
Finden Sie im
appsettings.json
den Platzhalter:Enter_the_Tenant_Subdomain_Here
und ersetzen Sie es durch die Verzeichnis-(Mandanten-)Unterdomäne. Wenn Ihre primäre Mandantendomäne z. B.contoso.onmicrosoft.com
ist, verwenden Siecontoso
. Wenn Sie Ihren Mandantennamen nicht kennen, lesen Sie die Informationen unter Abrufen der Details des Mandanten.Enter_the_Application_Id_Here
, und ersetzen Sie ihn mit der Anwendungs-ID (Client-ID) der zuvor von Ihnen registrierten Anwendung.
Verwenden einer benutzerdefinierten URL-Domäne (optional)
Verwenden Sie eine benutzerdefinierte Domäne, um die Authentifizierungs-URL vollständig zu kennzeichnen. Aus Benutzerperspektive verbleiben Benutzer während des Authentifizierungsprozesses in Ihrer Domäne, anstatt zu ciamlogin.com Domänennamen umgeleitet zu werden.
Führen Sie die folgenden Schritte aus, um eine benutzerdefinierte Domäne zu verwenden:
Führen Sie die Schritte unter Aktivieren benutzerdefinierter URL-Domänen für Apps in externen Mandanten aus, um eine benutzerdefinierte URL-Domäne für Ihren externen Mandanten zu aktivieren.
Öffnen sie appsettings.json Datei:
- Aktualisieren Sie den Wert der
Authority
Eigenschaft auf https://Enter_the_Custom_Domain_Here/Enter_the_Tenant_ID_Here. Ersetzen Sie sieEnter_the_Custom_Domain_Here
durch Ihre benutzerdefinierte URL-Domäne undEnter_the_Tenant_ID_Here
durch Ihre Mandanten-ID. Wenn Sie Ihre Mandanten-ID nicht kennen, finden Sie weitere Informationen unter Auslesen der Details Ihres Mandanten. - Hinzufügen einer
knownAuthorities
Eigenschaft mit einem Wert [Enter_the_Custom_Domain_Here].
- Aktualisieren Sie den Wert der
Nachdem Sie die Änderungen an Ihrer appsettings.json Datei vorgenommen haben, wenn Ihre benutzerdefinierte URL-Domäne login.contoso.com ist und Ihre Mandanten-ID aaaabbbb-0000-cccc-1111-ddddd222eeeee ist, sollte die Datei ähnlich wie der folgende Codeausschnitt aussehen:
{
"AzureAd": {
"Authority": "https://login.contoso.com/aaaabbbb-0000-cccc-1111-dddd2222eeee",
"ClientId": "Enter_the_Application_Id_Here",
"CacheFileName": "msal_cache.txt",
"CacheDir": "C:/temp",
"KnownAuthorities": ["login.contoso.com"]
},
"DownstreamApi": {
"Scopes": "openid offline_access"
}
}
Ausführen und Testen der .NET MAUI-Desktop-App
.NET MAUI-Apps sind für die Ausführung auf mehreren Betriebssystemen und Geräten konzipiert. Sie müssen auswählen, mit welchem Ziel Sie Ihre App testen und debuggen möchten.
Legen Sie das Debugziel in der Visual Studio-Symbolleiste auf das Gerät fest, mit dem Sie debuggen und testen möchten. Die folgenden Schritte veranschaulichen das Festlegen des Debugziels auf Windows:
- Wählen Sie die Dropdownliste " Debugziel " aus.
- Framework auswählen
- net7.0-windows... auswählen
Führen Sie die App aus, indem Sie F5 drücken oder die Wiedergabeschaltfläche oben in Visual Studio auswählen.
Sie können jetzt die .NET MAUI-Beispieldesktopanwendung testen. Nachdem Sie die Anwendung ausgeführt haben, wird automatisch das Fenster der Desktopanwendung angezeigt:
Wählen Sie im daraufhin angezeigten Desktopfenster die Schaltfläche Anmelden aus. Daraufhin wird ein Browserfenster geöffnet, in dem Sie aufgefordert werden, sich anzumelden.
Während des Anmeldevorgangs werden Sie aufgefordert, verschiedene Berechtigungen zu erteilen (damit die Anwendung auf Ihre Daten zugreifen kann). Nach erfolgreicher Anmeldung und Zustimmung wird auf dem Anwendungsbildschirm die Hauptseite angezeigt.