Authentifizieren von .NET-Apps bei Azure-Diensten während der lokalen Entwicklung mithilfe von Dienstprinzipalen

Entwickler müssen Cloud-Apps auf ihren lokalen Arbeitsstationen debuggen und testen. Wenn eine App während der lokalen Entwicklung auf der Arbeitsstation eines Entwicklers ausgeführt wird, muss sie sich weiterhin bei allen von der App verwendeten Azure-Diensten authentifizieren. In diesem Artikel erfahren Sie, wie Sie dedizierte Anwendungsdienstprinzipalobjekte einrichten, die während der lokalen Entwicklung verwendet werden sollen.

Diagramm, das zeigt, wie eine lokale .NET-App die Anmeldeinformationen des Entwicklers verwendet, um mithilfe lokal installierter Entwicklungstools eine Verbindung mit Azure herzustellen

Dedizierte Anwendungsdienstprinzipale für die lokale Entwicklung ermöglichen es Ihnen, das Prinzip der geringsten Rechte während der App-Entwicklung zu befolgen. Da Berechtigungen genau auf das festgelegt sind, was für die App während der Entwicklung benötigt wird, wird der App-Code daran gehindert, versehentlich auf eine Azure-Ressource zuzugreifen, die für die Verwendung durch eine andere App vorgesehen ist. Dadurch wird auch verhindert, dass Fehler auftreten, wenn die App in die Produktion verschoben wird, da die App in der Entwicklungsumgebung überprivilegiert war.

Ein Anwendungsdienstprinzipal wird für die App eingerichtet, wenn die App in Azure registriert ist. Beim Registrieren einer App für die lokale Entwicklung wird Folgendes empfohlen:

  • Erstellen Sie separate App-Registrierungen für jeden Entwickler, der an der App arbeitet. Dadurch werden separate Anwendungsdienstprinzipale für jeden Entwickler erstellt, die während der lokalen Entwicklung verwendet werden können, und entwickler müssen Keine Anmeldeinformationen für einen einzelnen Anwendungsdienstprinzipal freigeben.
  • Erstellen Sie separate App-Registrierungen pro App. Dadurch werden die Berechtigungen der App nur auf das festgelegt, was von der App benötigt wird.

Während der lokalen Entwicklung werden Umgebungsvariablen mit der Identität des Anwendungsdienstprinzipals festgelegt. Die Azure Identity-Bibliothek liest diese Umgebungsvariablen und verwendet diese Informationen, um die App bei den benötigten Azure-Ressourcen zu authentifizieren.

1 - Registrieren der Anwendung in Azure AD

Anwendungsdienstprinzipalobjekte werden mit einer App-Registrierung in Azure erstellt. Hierfür können Sie das Azure-Portal oder die Azure CLI verwenden.

Melden Sie sich beim Azure-Portal an, und führen Sie die folgenden Schritte aus.

Anweisungen Screenshot
Im Azure-Portal:
  1. Geben Sie auf der Suchleiste oben im Azure-Portal App Registrierungen ein.
  2. Wählen Sie im Menü, das unter der Suchleiste angezeigt wird, unter der Rubrik Dienste die Option App Registrierungen aus.
Screenshot: Verwenden der oberen Suchleiste im Azure-Portal zum Suchen und Navigieren zur Seite „App-Registrierungen
Wählen Sie auf der Seite „App-Registrierungen“ die Option + Neue Registrierung aus. Screenshot: Position der Schaltfläche „Neue Registrierung
Füllen Sie auf der Seite Registrieren einer Anwendung das Formular wie folgt aus.
  1. Name → Geben Sie einen Namen für die App-Registrierung in Azure ein. Es wird empfohlen, dass dieser Name den App-Namen, den Benutzer, für den die App-Registrierung gilt, und einen Bezeichner wie „dev“ enthält, um anzugeben, dass diese App-Registrierung für die lokale Entwicklung verwendet werden soll.
  2. Unterstützte KontotypenNur Konten in diesem Organisationsverzeichnis
Wählen Sie Registrieren aus, um Ihre App zu registrieren und den Anwendungsdienstprinzipal zu erstellen.
Screenshot: Ausfüllen der Seite Anwendung registrieren, indem Sie der App einen Namen geben und unterstützte Kontotypen nur als Konten in diesem Organisationsverzeichnis angeben.
Auf der App-Registrierungsseite für Ihre App:
  1. Anwendungs-ID (Client) → Dies ist die App-ID, die die App während der lokalen Entwicklung für den Zugriff auf Azure verwendet. Kopieren Sie diesen Wert an einen temporären Speicherort in einem Text-Editor, da Sie ihn in einem zukünftigen Schritt benötigen.
  2. Verzeichnis-ID (Mandanten-ID) → Dieser Wert wird auch von Ihrer App benötigt, wenn sie sich bei Azure authentifiziert. Kopieren Sie diesen Wert an einen temporären Speicherort in einem Text-Editor, da er auch in einem zukünftigen Schritt benötigt wird.
  3. Clientanmeldeinformationen → Sie müssen die Clientanmeldeinformationen für die App festlegen, bevor Ihre App sich bei Azure authentifizieren und Azure-Dienste verwenden kann. Wählen Sie Zertifikat oder Geheimnis hinzufügen aus, um Anmeldeinformationen für Ihre App hinzuzufügen.
Screenshot der App-Registrierungsseite nach Abschluss der App-Registrierung. Dieser Screenshot zeigt den Speicherort der Anwendungs-ID und mandanten-ID, die in einem zukünftigen Schritt benötigt werden. Außerdem wird der Speicherort des Links angezeigt, der zum Hinzufügen eines Anwendungsgeheimnisses für die App verwendet werden soll.
Wählen Sie auf der Seite Zertifikate und Geheimnisse die Option + Neuer geheimer Clientschlüssel aus. Screenshot: Speicherort des Links, der zum Erstellen eines neuen geheimen Clientschlüssels auf der Seite „Zertifikate und Geheimnisse
Das Dialogfeld Geheimer Clientschlüssel hinzufügen wird auf der rechten Seite der Seite angezeigt. In diesem Dialog:
  1. Beschreibung → Geben Sie den Wert Current ein.
  2. Läuft aus→ Wählen Sie einen Wert von 24 Monaten aus.
Wählen Sie Hinzufügen aus, um das Geheimnis hinzuzufügen.
Screenshot: Seite, auf der ein neuer geheimer Clientschlüssel für den Anwendungsdienstprinzipal hinzugefügt wird, der durch den App-Registrierungsprozess erstellt wird.
Auf der Seite Zertifikate und Geheimnisse wird der Wert des geheimen Clientschlüssels angezeigt.

Kopieren Sie diesen Wert an einen temporären Speicherort in einem Text-Editor, da Sie ihn in einem zukünftigen Schritt benötigen.

WICHTIG: Dieser Wert wird nur dieses eine Mal angezeigt. Sobald Sie diese Seite verlassen oder aktualisieren, können Sie diesen Wert nicht mehr anzeigen. Sie können einen zusätzlichen geheimen Clientschlüssel hinzufügen, ohne diesen geheimen Clientschlüssel für ungültig zu erklären. Dieser Wert wird jedoch nicht mehr angezeigt.
Screenshot: Seite mit dem generierten geheimen Clientschlüssel.

2: Erstellen einer Microsoft Entra-Gruppe für die lokale Entwicklung

Da es in der Regel mehrere Entwickler gibt, die an einer App arbeiten, wird empfohlen, eine Microsoft Entra-Gruppe zu erstellen, um die Rollen (Berechtigungen) zu kapseln, die die App in der lokalen Entwicklung benötigt, anstatt die Rollen einzelnen Dienstprinzipalobjekten zuzuweisen. Diese Vorgehensweise bietet folgende Vorteile:

  • Jedem Entwickler wird sichergestellt, dass dieselben Rollen zugewiesen werden, da Rollen auf Gruppenebene zugewiesen werden.
  • Wenn eine neue Rolle für die App erforderlich ist, muss sie nur der Gruppe für die App hinzugefügt werden.
  • Wenn ein neuer Entwickler dem Team beitritt, wird ein neuer Anwendungsdienstprinzipal für den Entwickler erstellt und der Gruppe hinzugefügt, um zu sorgen, dass der Entwickler über die richtigen Berechtigungen für die Arbeit an der App verfügt.
Anweisungen Screenshot
Navigieren Sie zur Microsoft Entra ID-Seite im Azure-Portal, indem Sie Microsoft Entra ID in das Suchfeld oben auf der Seite eingeben. Wählen Sie im Abschnitt Dienste den Eintrag Microsoft Entra ID aus. Screenshot: Verwenden der oberen Suchleiste im Azure-Portal, um nach der Microsoft Entra ID-Seite zu suchen und zu dieser zu navigieren
Wählen Sie auf der Seite Microsoft Entra ID im Menü auf der linken Seite die Option Gruppen aus. Screenshot: Position des Menüelements „Gruppen“ im linken Menü der Microsoft Entra-Standardverzeichnisseite
Wählen Sie auf der Seite Alle GruppenNeue Gruppeaus. Screenshot: Position der Schaltfläche „Neue Gruppe
Auf der Seite Neue Gruppe :
  1. GruppentypSecurity
  2. Gruppenname → Ein Name für die Sicherheitsgruppe, der in der Regel aus dem Anwendungsnamen erstellt wird. Es ist auch hilfreich, eine Zeichenfolge wie local-dev in den Namen der Gruppe aufzunehmen, um den Zweck der Gruppe anzugeben.
  3. Gruppenbeschreibung → Eine Beschreibung des Zwecks der Gruppe.
  4. Wählen Sie unter Mitglieder den Link Keine Mitglieder ausgewählt aus, um der Gruppe Mitglieder hinzuzufügen.
Screenshot: Ausfüllen des Formulars, um eine neue Microsoft Entra-Gruppe für die Anwendung zu erstellen. Auf diesem Screenshot ist außerdem die Position des Links zu sehen, der zum Hinzufügen von Mitgliedern zu dieser Gruppe ausgewählt wird.
Das Dialogfeld Mitglieder hinzufügen wird angezeigt.
  1. Verwenden Sie das Suchfeld, um die Liste der Namen der Auftraggeber in der Liste zu filtern.
  2. Wählen Sie die Anwendungsdienstprinzipale für die lokale Entwicklung für diese App aus. Wenn Objekte ausgewählt werden, werden sie ausgegraut und in die Liste Ausgewählte Objekte unten im Dialogfeld verschoben.
  3. Wenn Sie fertig sind, wählen Sie die Schaltfläche Auswählen aus.
Screenshot des Dialogfelds Mitglieder hinzufügen, das zeigt, wie Entwicklerkonten ausgewählt werden, die in die Gruppe aufgenommen werden sollen..
Wählen Sie auf der Seite Neue Gruppe die Option Erstellen aus, um die Gruppe zu erstellen.

Die Gruppe wird erstellt, und Sie gelangen zurück zur Seite Alle Gruppen. Es kann bis zu 30 Sekunden dauern, bis die Gruppe angezeigt wird. Möglicherweise müssen Sie die Seite aufgrund der Zwischenspeicherung im Azure-Portal aktualisieren.
Screenshot der Seite „Neue Gruppe

3 : Zuweisen von Rollen zur Anwendung

Bestimmen Sie als Nächstes, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und diese Rollen Ihrer App zuweisen. In diesem Beispiel werden die Rollen der in Schritt 2 erstellten Microsoft Entra-Gruppe zugewiesen. Gruppen kann in einem Ressourcen-, Ressourcengruppen- oder Abonnementbereich eine Rolle zugewiesen werden. In diesem Beispiel wird gezeigt, wie Sie Rollen im Ressourcengruppenbereich zuweisen, da die meisten Apps alle Azure-Ressourcen in einer einzelnen Ressourcengruppe gruppieren.

Anweisungen Screenshot
Suchen Sie die Ressourcengruppe für Ihre App, indem Sie über das Suchfeld oben im Azure-Portal nach dem Namen der Ressourcengruppe suchen. Navigieren Sie zu Ihrer Ressourcengruppe, indem Sie den Namen der Ressourcengruppe unter der Überschrift Ressourcengruppen im Dialogfeld auswählen. Screenshot: Verwenden des oberen Suchfelds im Azure-Portal zum Suchen und Navigieren zu der Ressourcengruppe, denen Sie Rollen (Berechtigungen) zuweisen möchten.
Wählen Sie auf der Seite für die Ressourcengruppe im linken Menü Die Option Zugriffssteuerung (IAM) aus. Screenshot der Seite
Klicken Sie auf der Seite Zugriffssteuerungseinstellungen:
  1. Klicken Sie auf die Registerkarte Rollenzuweisungen.
  2. Wählen Sie im oberen Menü + Hinzufügen und aus dem dann angezeigten Dropdownmenü die Option Rollenzuweisung hinzufügen aus.
Screenshot, der zeigt, wie Sie zur Registerkarte Rollenzuweisungen und zum Speicherort der Schaltfläche navigieren, die zum Hinzufügen von Rollenzuweisungen zu einer Ressourcengruppe verwendet wird.
Auf der Seite Rollenzuweisung hinzufügen werden alle Rollen aufgelistet, die der Ressourcengruppe zugewiesen werden können.
  1. Verwenden Sie das Suchfeld, um die Liste auf eine besser verwaltbare Größe zu filtern. In diesem Beispiel wird gezeigt, wie Sie nach Storage-Blobrollen filtern.
  2. Wählen Sie die Rolle aus, die Sie zuweisen möchten.
Klicken Sie auf Weiter, um zum nächsten Bildschirm zu wechseln.
Screenshot: Filtern und Auswählen von Rollenzuweisungen, die der Ressourcengruppe hinzugefügt werden sollen.
Auf der nächsten Seite Rollenzuweisung hinzufügen können Sie angeben, welchem Benutzer die Rolle zugewiesen werden soll.
  1. Wählen Sie unter Zugriff zuweisendie Option Benutzer, Gruppe oder Dienstprinzipal aus.
  2. Wählen Sie unter Mitglieder die Option + Mitglieder auswählen aus.
Auf der rechten Seite des Azure-Portal wird ein Dialogfeld geöffnet.
Screenshot: Optionsfeld zum Zuweisen einer Rolle zu einer Microsoft Entra-Gruppe und Link zum Auswählen der Gruppe, der die Rolle zugewiesen werden soll
Im Dialogfeld Mitglieder auswählen :
  1. Das Textfeld Auswählen kann verwendet werden, um die Liste der Benutzer und Gruppen in Ihrem Abonnement zu filtern. Geben Sie bei Bedarf die ersten Zeichen der lokalen Microsoft Entra-Gruppe ein, die Sie für die App erstellt haben.
  2. Wählen Sie die Microsoft Entra-Gruppe für lokale Entwicklung aus, die Ihrer Anwendung zugeordnet ist.
Wählen Sie unten im Dialogfeld Auswählen aus, um den Vorgang fortzusetzen.
Screenshot: Filtern nach und Auswählen der Microsoft Entra-Gruppe für die Anwendung im Dialogfeld „Mitglieder auswählen“
Die Microsoft Entra-Gruppe wird auf dem Bildschirm Rollenzuweisung hinzufügen als ausgewählt angezeigt. Wählen Sie Überprüfen und zuweisen aus, um zur letzten Seite zu gelangen, und wählen Sie erneut Überprüfen und zuweisen aus, um den Vorgang abzuschließen. Screenshot der abgeschlossenen Seite

4 : Festlegen von Anwendungsumgebungsvariablen

DefaultAzureCredential sucht zur Laufzeit nach den Dienstprinzipalinformationen in einer Reihe von Umgebungsvariablen. Es gibt mehrere Möglichkeiten, Umgebungsvariablen zu konfigurieren, wenn Sie mit .NET arbeiten, abhängig von Ihren Tools und Ihrer Umgebung.

Unabhängig vom gewählten Ansatz konfigurieren Sie die folgenden Umgebungsvariablen, wenn Sie mit einem Dienstprinzipal arbeiten:

  • AZURE_CLIENT_ID → Der App-ID-Wert.
  • AZURE_TENANT_ID → Der Wert der Mandanten-ID.
  • AZURE_CLIENT_SECRET → Das für die App generierte Kennwort/Anmeldeinformationen.

Wenn Sie lokal mit Visual Studio arbeiten, können Umgebungsvariablen in der launchsettings.json Datei im Properties Ordner Ihres Projekts festgelegt werden. Wenn die App gestartet wird, werden diese Werte automatisch abgerufen. Beachten Sie, dass diese Konfigurationen nicht mit Ihrer App übertragen werden, wenn sie bereitgestellt wird. Daher müssen Sie Umgebungsvariablen in Ihrer Zielhostumgebung einrichten.

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    }
  }

5 - Implementieren von DefaultAzureCredential in Ihrer Anwendung

DefaultAzureCredential ist eine dogmatische, sortierte Sequenz von Mechanismen für die Authentifizierung bei Microsoft Entra. Jeder Authentifizierungsmechanismus ist eine von der TokenCredential-Klasse abgeleitete Klasse, die als Anmeldeinformationen bezeichnet wird. Zur Laufzeit versucht DefaultAzureCredential, sich mit den ersten Anmeldeinformationen zu authentifizieren. Wenn diese Anmeldeinformationen kein Zugriffstoken abrufen, werden die nächsten Anmeldeinformationen in der Sequenz ausprobiert usw., bis erfolgreich ein Zugriffstoken abgerufen wurde. Auf diese Weise kann Ihre App unterschiedliche Anmeldeinformationen in verschiedenen Umgebungen verwenden, ohne umgebungsspezifischen Code zu schreiben.

Die Reihenfolge und die Speicherorte, in denen nach Anmeldeinformationen gesucht wird, DefaultAzureCredential finden Sie unter DefaultAzureCredential.

Fügen Sie zur Verwendung von DefaultAzureCredential das Paket Azure.Identity und optional das Paket Microsoft.Extensions.Azure zu Ihrer Anwendung hinzu:

Navigieren Sie in einem Terminal Ihrer Wahl zum Anwendungsprojektverzeichnis, und führen Sie die folgenden Befehle aus:

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Auf Azure-Dienste wird mithilfe spezieller Clientklassen aus den verschiedenen Azure SDK-Clientbibliotheken zugegriffen. Diese Klassen und Ihre eigenen benutzerdefinierten Dienste sollten registriert werden, damit über die Abhängigkeitsinjektion in der gesamten App darauf zugegriffen werden kann. Führen Sie in Program.cs die folgenden Schritte aus, um eine Clientklasse und DefaultAzureCredential zu registrieren:

  1. Schließen Sie die Namespaces Azure.Identity und Microsoft.Extensions.Azure über using-Direktiven ein.
  2. Registrieren Sie den Azure-Dienstclient mithilfe der entsprechenden Erweiterungsmethode mit dem Präfix Add.
  3. Übergeben Sie eine Instanz von DefaultAzureCredential an die UseCredential-Methode.

Zum Beispiel:

using Microsoft.Extensions.Azure;
using Azure.Identity;

builder.Services.AddAzureClients(clientBuilder =>
{
    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));
    clientBuilder.UseCredential(new DefaultAzureCredential());
});

Eine Alternative zu UseCredential besteht darin, DefaultAzureCredential direkt zu instanziieren:

using Azure.Identity;

builder.Services.AddSingleton<BlobServiceClient>(_ =>
    new BlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"),
        new DefaultAzureCredential()));

Wenn der vorherige Code auf Ihrer lokalen Entwicklungsarbeitsstation ausgeführt wird, sucht er in den Umgebungsvariablen nach einem Anwendungsdienstprinzipal oder in lokal installierten Entwicklertools (etwa Visual Studio) nach einem Satz von Entwickleranmeldeinformationen. Beide Ansätze können verwendet werden, um die App während der lokalen Entwicklung bei Azure-Ressourcen zu authentifizieren.

Bei der Bereitstellung in Azure kann dieser Code Ihre App auch bei anderen Azure-Ressourcen authentifizieren. DefaultAzureCredential kann Umgebungseinstellungen und Konfigurationen für verwaltete Identitäten abrufen, um sich automatisch bei anderen Diensten zu authentifizieren.