Freigeben über


Authentifizierung von .NET-Apps mit Azure-Diensten während der lokalen Entwicklung mithilfe von Dienstprinzipalen

Während der lokalen Entwicklung müssen sich Anwendungen bei Azure authentifizieren, um auf verschiedene Azure-Dienste zuzugreifen. Zwei gängige Ansätze für die lokale Authentifizierung sind die Verwendung eines Entwicklerkontos oder eines Dienstprinzipals. Dieser Artikel erklärt, wie Sie einen Anwendungsdienstprinzipal verwenden. In den folgenden Abschnitten lernen Sie Folgendes:

  • So registrieren Sie eine Anwendung in Microsoft Entra, um einen Service Principal zu erstellen
  • Verwenden von Microsoft Entra-Gruppen zum effizienten Verwalten von Berechtigungen
  • Zuweisung von Rollen zu Bereichsberechtigungen
  • So authentifizieren Sie sich über einen Dienstprinzipal von Ihrem Anwendungscode aus

Wenn Sie dedizierte Anwendungsdienstprinzipale verwenden, können Sie das Prinzip der geringsten Rechte beim Zugriff auf Azure-Ressourcen einhalten. Berechtigungen sind auf die spezifischen Anforderungen der App während der Entwicklung beschränkt und verhindern den versehentlichen Zugriff auf Azure-Ressourcen, die für andere Apps oder Dienste vorgesehen sind. Dieser Ansatz hilft auch, Probleme zu vermeiden, wenn die App in die Produktion verschoben wird, indem sichergestellt wird, dass sie in der Entwicklungsumgebung nicht überprivilegiert ist.

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

Wenn die App in Azure registriert ist, wird ein Anwendungsdienstprinzipal erstellt. Für die lokale Entwicklung:

  • Erstellen Sie für jeden Entwickler, der an der App arbeitet, eine eigene App-Registrierung, um sicherzustellen, dass jeder Entwickler seinen eigenen Anwendungsdienst-Prinzipal hat und keine Anmeldedaten austauschen muss.
  • Erstellen Sie eine separate App-Registrierung für jede App, um die Berechtigungen der App nur auf die erforderlichen Elemente zu beschränken.

Während der lokalen Entwicklung werden Umgebungsvariablen mit der Identität des Anwendungsdienstprinzipals festgelegt. Die Azure Identity-Bibliothek liest diese Umgebungsvariablen vor, um die App bei den erforderlichen Azure-Ressourcen zu authentifizieren.

Registrieren der App in Azure

Anwendungsdienstprinzipalobjekte werden über eine App-Registrierung in Azure mithilfe des Azure-Portals oder der Azure CLI erstellt.

  1. Verwenden Sie im Azure-Portal die Suchleiste, um zur App-Registrierungen Seite zu navigieren.

  2. Wählen Sie auf der Seite „App-Registrierungen“ die Option + Neue Registrierung aus.

  3. Gehen Sie auf der Seite Registrieren einer Anwendung folgendermaßen vor:

    • Geben Sie für das Feld Name einen beschreibenden Wert ein, der den App-Namen und die Zielumgebung enthält.
    • Wählen Sie unter Unterstützte Kontotypendie Option Nur Konten in diesem Organisationsverzeichnis (nur Microsoft Customer Led - Single Tenant)oder die Option, die Ihren Anforderungen am besten entspricht.
  4. Wählen Sie Registrieren , um Ihre App zu registrieren und den Dienstprinzipal zu erstellen.

    Ein Screenshot, der zeigt, wie Sie eine App-Registrierung im Azure-Portal erstellen.

  5. Kopieren Sie auf der Seite App-Registrierung Ihrer App die Anwendungs-ID (Client-ID) und Verzeichnis-ID (Mandanten-ID) und fügen Sie sie an einem temporären Speicherort ein, um sie später in Ihren App-Codekonfigurationen zu verwenden.

  6. Wählen Sie Zertifikat oder Geheimnis hinzufügen , um Anmeldedaten für Ihre App einzurichten.

  7. Auf der Seite Zertifikate & Geheimnisse wählen Sie + Neues Client-Geheimnis.

  8. In dem Hinzufügen eines Client-Geheimnisses Flyout-Panel, das sich öffnet:

    • Für die Beschreibunggeben Sie den Wert Current ein.
    • Für den Wert Expires belassen Sie den empfohlenen Standardwert von 180 Tagen.
    • Wählen Sie Hinzufügen aus, um das Geheimnis hinzuzufügen.
  9. Kopieren Sie auf der Seite Zertifikate & Geheimnisse die Eigenschaft Wert des Client-Geheimnisses zur Verwendung in einem späteren Schritt.

    Anmerkung

    Der Wert des geheimen Clientschlüssels wird nur einmal angezeigt, nachdem die App-Registrierung erstellt wurde. Sie können weitere geheime Clientschlüssel hinzufügen, ohne diesen geheimen Clientschlüssel ungültig zu machen, aber es gibt keine Möglichkeit, diesen Wert erneut anzuzeigen.

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

Erstellen Sie eine Microsoft Entra-Gruppe, um die Rollen (Berechtigungen) zu kapseln, die die App in der lokalen Entwicklung benötigt, anstatt die Rollen einzelnen Dienstprinzipalobjekten zuzuweisen. Dieser Ansatz bietet die folgenden Vorteile:

  • Jeder Entwickler hat die gleichen Rollen auf Gruppenebene zugewiesen.
  • 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 sicherzustellen, dass der Entwickler über die richtigen Berechtigungen für die Arbeit an der App verfügt.
  1. Navigieren Sie zur Microsoft Entra ID Übersichtsseite im Azure-Portal.

  2. Wählen Sie Alle Gruppen aus dem linken Menü aus.

  3. Auf der Seite Gruppen wählen Sie Neue Gruppe.

  4. Füllen Sie auf der Seite Neue Gruppe die folgenden Formularfelder aus:

    • Gruppentyp: Wählen Sie Sicherheits-aus.
    • Gruppenname: Geben Sie einen Namen für die Gruppe ein, die einen Verweis auf den App- oder Umgebungsnamen enthält.
    • Gruppenbeschreibung: Geben Sie eine Beschreibung ein, die den Zweck der Gruppe erläutert.

    Ein Screenshot, der zeigt, wie eine Gruppe im Azure-Portal erstellt wird.

  5. Wählen Sie den Link "Keine Mitglieder ausgewählt" unter "Mitglieder" aus, um der Gruppe Mitglieder hinzuzufügen.

  6. Suchen Sie im daraufhin geöffneten Flyoutbereich nach dem zuvor erstellten Dienstprinzipal, und wählen Sie ihn aus den gefilterten Ergebnissen aus. Wählen Sie die Schaltfläche Auswählen am unteren Rand des Fensters, um Ihre Auswahl zu bestätigen.

  7. Wählen Sie Erstellen unten auf der Seite Neue Gruppe , um die Gruppe zu erstellen und zur Seite Alle Gruppen zurückzukehren. Wenn die neue Gruppe nicht aufgeführt ist, warten Sie einen Moment, und aktualisieren Sie die Seite.

Weisen Sie der Gruppe Rollen zu

Ermitteln Sie als Nächstes, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und weisen Sie diese Rollen der von Ihnen erstellten Microsoft Entra-Gruppe zu. Gruppen können einer Rolle im Ressourcen-, Ressourcengruppen- oder Abonnementbereich zugewiesen werden. In diesem Beispiel wird gezeigt, wie Rollen im Ressourcengruppenbereich zugewiesen werden, da die meisten Apps alle ihre Azure-Ressourcen in einer einzelnen Ressourcengruppe gruppieren.

  1. Navigieren Sie im Azure-Portal zur Seite Übersicht der Ressourcengruppe, die Ihre App enthält.

  2. Wählen Sie im linken Navigationsbereich auf Zugriffssteuerung (IAM) .

  3. Wählen Sie auf der Seite Zugriffskontrolle (IAM) die Option + Hinzufügen und dann aus dem Dropdown-Menü die Option Rollenzuweisung hinzufügen . Die Seite Rollenzuweisung hinzufügen bietet mehrere Registerkarten zur Konfiguration und Zuweisung von Rollen.

  4. Verwenden Sie auf der Registerkarte Rolle das Suchfeld, um die Rolle zu suchen, die Sie zuweisen möchten. Wählen Sie die Rolle aus und wählen Sie dann Weiter.

  5. Auf der Registerkarte Mitglieder :

    • Für den Wert Zugriff zuweisen zu wählen Sie Benutzer-, Gruppen- oder Dienstprinzipal .
    • Für den Wert Mitglieder wählen Sie +Mitglieder auswählen , um das Flyout-Panel Mitglieder auswählen zu öffnen.
    • Suchen Sie nach der Zuvor erstellten Microsoft Entra-Gruppe, und wählen Sie sie aus den gefilterten Ergebnissen aus. Wählen Sie Auswählen , um die Gruppe auszuwählen und das Flyout-Panel zu schließen.
    • Wählen Sie Überprüfen + Zuweisen unten auf der Registerkarte Mitglieder .

    Ein Screenshot, der zeigt, wie Sie der Microsoft Entra-Gruppe eine Rolle zuweisen.

  6. Wählen Sie auf der Registerkarte Überprüfen + zuweisen unten auf der Seite Überprüfen + zuweisen .

Festlegen der App-Umgebungsvariablen

Zur Laufzeit suchen bestimmte Anmeldeinformationen aus der Azure Identity Bibliothek, wie z.B. DefaultAzureCredential, EnvironmentCredentialund ClientSecretCredential, per Konvention in den Umgebungsvariablen nach Dienstprinzipalinformationen. Es gibt mehrere Möglichkeiten zum Konfigurieren von Umgebungsvariablen beim Arbeiten mit .NET, je nach Tool und Umgebung.

Konfigurieren Sie unabhängig vom gewählten Ansatz die folgenden Umgebungsvariablen für einen Dienstprinzipal:

  • AZURE_CLIENT_ID: Wird verwendet, um die registrierte App in Azure zu identifizieren.
  • AZURE_TENANT_ID: Die ID des Microsoft Entra-Mandanten.
  • AZURE_CLIENT_SECRET: Die geheimen Anmeldeinformationen, die für die App generiert wurden.

In Visual Studio können Umgebungsvariablen in der datei launchsettings.json im Ordner Properties Ihres Projekts festgelegt werden. Diese Werte werden automatisch abgerufen, wenn die App gestartet wird. Diese Konfigurationen reisen jedoch während der Bereitstellung nicht mit Ihrer App zusammen, daher müssen Sie Umgebungsvariablen in Ihrer Zielhostingumgebung einrichten.

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "<your-client-id>",
        "AZURE_TENANT_ID":"<your-tenant-id>",
        "AZURE_CLIENT_SECRET": "<your-client-secret>"
      }
    }
  }

Authentifizieren von Azure-Diensten aus Ihrer App

Die Azure Identity-Bibliothek bietet verschiedene Anmeldeinformationen – Implementierungen von TokenCredential –, die angepasst wurden, um verschiedene Szenarien und Microsoft Entra-Authentifizierungsflüsse zu unterstützen. Die folgenden Schritte zeigen Ihnen, wie Sie ClientSecretCredential verwenden, wenn Sie lokal und in der Produktion mit Service-Principals arbeiten.

Implementieren des Codes

Fügen Sie das Azure.Identity-Paket hinzu. Installieren Sie in einem ASP.NET Core-Projekt auch das Microsoft.Extensions.Azure-Paket:

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 für die Abhängigkeitsinjektion registriert werden, damit sie in ihrer gesamten App verwendet werden können. Führen Sie in Program.csdie folgenden Schritte aus, um eine Clientklasse für die Abhängigkeitsinjektion und die tokenbasierte Authentifizierung zu konfigurieren:

  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. Konfigurieren Sie ClientSecretCredential mit dem tenantId, clientIdund clientSecret.
  4. Übergeben Sie die ClientSecretCredential Instanz an die UseCredential-Methode.
builder.Services.AddAzureClients(clientBuilder =>
{
    var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
    var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
    var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

    clientBuilder.AddBlobServiceClient(
        new Uri("https://<account-name>.blob.core.windows.net"));

    clientBuilder.UseCredential(new ClientSecretCredential(tenantId, clientId, clientSecret));
});

Eine Alternative zur UseCredential-Methode besteht darin, die Anmeldeinformationen direkt für den Dienstclient bereitzustellen:

var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");
var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");

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