OpenID Connect, MSAL und .NET SDKs unter Azure ID .NET-Webanwendung mit interaktiver Authentifizierung

Anbieter zum Thema

Open ID Connect lässt sich über Microsoft Identity Platform und Microsoft Authentication Library, kurz MSAL, auf verschiedenen Wegen integrieren. In diesem Beitrag erstellen wir eine lokale ASP.NET- bzw. NET-Core-Webapp auf Basis der MVC-Vorlage (Model View Controller), und statten diese mit einer Authentifizierungsebene aus.

Nach Bereitstellung unserer App kann der User kann per Azure-Default die Einwilligung zu den angeforderten App-Berechtigungen erteilen.
Nach Bereitstellung unserer App kann der User kann per Azure-Default die Einwilligung zu den angeforderten App-Berechtigungen erteilen.
(Bild: Drilling / Microsoft)

Wie wir eine Anwendung als neue App-Registrierung im Azure-AD registrieren, haben wir bereits in den Artikeln zur „Microsoft Identity Platform 2.0“ und zur „Microsoft Authentication Library“ gezeigt. Wir melden uns dazu im Azure Portal an, suchen den Dienst „Azure AD“ und navigieren im Azure-AD-Blade zu „App-Registrierungen > Neue Registrierung“.

Die unterstützten Kontotypen und die Umleitungs-URL.
Die unterstützten Kontotypen und die Umleitungs-URL.
(Bild: Drilling / Microsoft)

Für die Registrierung kann ein beliebiger Name herhalten, hier z. B. „ms-identity-asp-example-reg“. Bei „Unterstütze Kontotypen“ wählen wir in diesem Beispiel nur der Einfachheit halber „Nur Konten in diesem Organisationsverzeichnis (nur "XXXXXX.XX" – einzelner Mandant)“. In der Praxis wird es wohl eher häufiger vorkommen, dass App-Benutzer auch aus externen Identitätsquellen akzeptiert werden. Bei Umleitungs-URL wählen wir diesmal als Plattform „Öffentlicher Client/nativ (mobil Desktop)“ aus, und geben rechts „http://localhost“ als URL an. Es folgt ein Klick auf „Registrieren“.

Bereitstellen einer Konsolen-App

Nun können wir die Beispiel-App bereitstellen. Zunächst erstellen wir hierfür ein passenden Arbeitsverzeichnis, wechseln in dieses und erstellen dann wie folgt eine .Net-Konsolen-Applikation:

cd ~\Documents\ms-identity-asp-auth
dotnet new console

Danach öffnen wir den neuen Ordner in VS Code.

code . -r

Ferner gilt es, dem Projekt neben dem erforderlichen Code noch eine Reihe von Paketen hinzuzufügen:

dotnet add package Microsoft.Identity.Client

Das Einbinden von Microsoft.Identity.Client unter Visual Studio Code.
Das Einbinden von Microsoft.Identity.Client unter Visual Studio Code.
(Bild: Drilling / Microsoft)

Dann öffnen wir die Datei Program.cs in VS Code und ergänzen die Datei um die für das Einbinden von Microsoft.Identity.Client …

using System.Threading.Tasks;
using Microsoft.Identity.Client;

… und die zum Aktivieren von asynchronen Vorgängen erforderlichen C#-Anweisungen. Für letzteres ist es erforderlich, die Main-Method wie folgt zu ändern:

public static async Task Main(string[] args)

Nun lässt sich der Code für die interaktive Authentifizierung ergänzen. Hierfür definieren wir zwei Variablen. Eine zum Speichern der Anwendungs-ID (Client) und eine für die Verzeichnis-ID (Mandant). Der Einfachheit halber empfiehlt es sich, die Werte aus dem Azure Portal bei der App Registrierung zu kopieren:

private const string _clientId = "APPLICATION_CLIENT_ID";
private const string _tenantId = "DIRECTORY_TENANT_ID";

Für das Erstellen des Autorisierungskontextes verwenden wir die Klasse „PublicClientApplicationBuilder“.

var app = PublicClientApplicationBuilder
   .Create(_clientId)
   .WithAuthority(AzureCloudInstance.AzurePublic, _tenantId)
   .WithRedirectUri("http://localhost")
   .Build();

Das Erstellen des Autorisierungskontextes mit Hilfe der Klasse „PublicClientApplicationBuilder“.
Das Erstellen des Autorisierungskontextes mit Hilfe der Klasse „PublicClientApplicationBuilder“.
(Bild: Drilling / Microsoft)

Sobald die Registrierung erfolgt ist, wird für die App wie im letzten Beitrag gezeigt automatisch eine API-Berechtigung für Microsoft Graph generiert, die wiederrum benutzt wird, um ein Token vom Azure AD abzurufen. Hierfür legen Sie nun den Berechtigungsbereich für die Token-Anforderung fest. Das geschieht mit Hilfe des CodeSniplets „PublicClientApplicationBuilder“. Wir fügen daher nun den Code für die Token-Anforderung hinzu und geben das Ergebnis einfach in der Konsole aus:

string[] scopes = { "user.read" };
AuthenticationResult result = await app.AcquireTokenInteractive(scopes).ExecuteAsync();
Console.WriteLine($"Token:\t{result.AccessToken}");

Das Ergebnis sollte dann etwa so aussehen, wie im vorigen Bild.

Der Build verläuft ohne Fehler.
Der Build verläuft ohne Fehler.
(Bild: Drilling / Microsoft)

Zum Ausführen und Testen der Anwendung geben wir am einfachsten im VS Code-Terminal …

dotnet build

… ein, um zunächst nach etwaigen Fehlern zu suchen, und anschließend:

dotnet run

Der User kann per Azure-Default die Einwilligung zu den angeforderten App-Berechtigungen erteilen.
Der User kann per Azure-Default die Einwilligung zu den angeforderten App-Berechtigungen erteilen.
(Bild: Drilling / Microsoft)

Wenn alles okay ist, öffnet die App den Standardbrowser und fordert den Benutzer zur Wahl des Kontos auf, mit dem er sich authentifizieren möchten. Authentifizieren wir uns zum ersten Mal bei der registrierten App, erhalten wir eine Benachrichtigung „Berechtigungen angefordert (User Consent)“, die dazu auffordert, die App zum Lesen von Daten zu genehmigen, die dem Konto zugeordnet sind. Dies müssen wir akzeptieren.

Übrigens können Sie der zugrunde liegenden Azure-Dokumentation die von der MSAL unterstützten Anwendungstypen/Szenarien und Authentifizierungs­workflows entnehmen, hier noch einmal in zwei Tabellen dargestellt.

Library Supported platforms and frameworks
MSAL for Android Android
MSAL Angular Single-page apps with Angular and Angular.js frameworks
MSAL for iOS and macOS iOS and macOS
MSAL Go (Preview) Windows, macOS, Linux
MSAL Java Windows, macOS, Linux
MSAL.js JavaScript/TypeScript frameworks such as Vue.js, Ember.js, or Durandal.js
MSAL.NET .NET Framework, .NET Core, Xamarin Android, Xamarin iOS, Universal Windows Platform
MSAL Node Web apps with Express, desktop apps with Electron, Cross-platform console apps
MSAL Python Windows, macOS, Linux
MSAL React Single-page apps with React and React-based libraries (Next.js, Gatsby.js)
Flow Description
Authorization code Native and web apps securely obtain tokens in the name of the user
Client credentials Service applications run without user interaction
On-behalf-of The application calls a service/web API, which in turns calls Microsoft Graph
Implicit Used in browser-based applications
Device code Enables sign-in to a device by using another device that has a browser
Integrated Windows Windows computers silently acquire an access token when they are domain joined
Interactive Mobile and desktops applications call Microsoft Graph in the name of a user
Username/password The application signs in a user by using their username and password

(ID:48780173)

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung