Authentifizierung von NET-Apps bei Azure-Diensten während der lokalen Entwicklung mithilfe von Dienstprinzipien

Beim Erstellen von Cloudanwendungen müssen Entwickler Anwendungen auf ihrer lokalen Arbeitsstation debuggen und testen. Wenn eine Anwendung 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.

A diagram showing how a .NET app during local development will use the developer's credentials to connect to Azure by obtaining those credentials locally installed development tools.

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 von Apps 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. Das Azure SDK für NET 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.
A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page.
Wählen Sie auf der Seite „App-Registrierungen“ die Option + Neue Registrierung aus. A screenshot showing the location of the New registration button in the App registrations page.
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" enthalten, um anzugeben, dass diese App-Registrierung für die lokale Entwicklung verwendet werden soll.
  2. Unterstützte Kontotypen Nur Konten in diesem Organisationsverzeichnis.
Wählen Sie Registrieren aus, um Ihre App zu registrieren und den Anwendungsdienstprinzipal zu erstellen.
A screenshot showing how to fill out the Register an application page by giving the app a name and specifying supported account types as accounts in this organizational directory only.
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 Sie ihn in einem zukünftigen Schritt benötigen.
  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.
A screenshot of the App registration page after the app registration has been completed. This screenshot shows the location of the application ID and tenant ID, which will be needed in a future step. It also shows the location of the link to use to add an application secret for the app.
Wählen Sie auf der Seite „Zertifikate und geheime Schlüssel“ + Neuer geheimer Clientschlüssel aus. A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page.
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.
A screenshot showing the page where a new client secret is added for the application service principal create by the app registration process.
Auf der Seite Zertifikate und geheime Schlüssel wird Ihnen 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: Dies ist das einzige Mal, dass dieser Wert angezeigt wird. Nachdem Sie diese Seite verlassen oder aktualisiert haben, wird dieser Wert nicht mehr angezeigt. 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.
A screenshot showing the page with the generated client secret.

2 - Erstellen Sie eine Azure AD-Sicherheitsgruppe für die lokale Entwicklung

Da es in der Regel mehrere Entwickler gibt, die an einer Anwendung arbeiten, wird empfohlen, eine Azure AD-Gruppe zu erstellen, um die Rollen (Berechtigungen) zu kapseln, die die App in der lokalen Entwicklung benötigt, anstatt die Rollen einzelnen Dienstprinzipalobjekten zuzuweisen. Dies bietet die folgenden 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 Azure AD-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 im Azure-Portal zur Seite Azure Active Directory, indem Sie oben auf der Seite Azure Active Directory in das Suchfeld eingeben und dann unter Dienste Azure Active Directory auswählen. A screenshot showing how to use the top search bar in the Azure portal to search for and navigate to the Azure Active Directory page.
Wählen Sie auf der Seite Azure Active Directory im menü auf der linken Seite die Option Gruppen aus. A screenshot showing the location of the Groups menu item in the left-hand menu of the Azure Active Directory Default Directory page.
Wählen Sie auf der Seite Alle GruppenNeue Gruppeaus. A screenshot showing the location of the New Group button in the All groups page.
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.
A screenshot showing how to fill out the form to create a new Azure Active Directory group for the application. This screenshot also shows the location of the link to select to add members to this group.
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.
A screenshot of the Add members dialog box showing how to select application service principals to be included in the group.
Wählen Sie auf der Seite Neue Gruppe die Option Erstellen aus, um die Gruppe zu erstellen.

Die Gruppe wird erstellt, und Sie werden zur Seite Alle Gruppen zurückgeführt. Es kann bis zu 30 Sekunden dauern, bis die Gruppe angezeigt wird, und Sie müssen die Seite möglicherweise aktualisieren, da sie im Azure-Portal zwischengespeichert wird.
A screenshot of the New Group page showing how to complete the process by selecting the Create button.

3 : Zuweisen von Rollen zur Anwendung

Als Nächstes müssen Sie bestimmen, welche Rollen (Berechtigungen) Ihre App für welche Ressourcen benötigt, und diese Rollen Ihrer App zuweisen. In diesem Beispiel werden die Rollen der Azure Active Directory-Gruppe zugewiesen, die in Schritt 2 erstellt wurde. Rollen können in einem Ressourcen-, Ressourcengruppen- oder Abonnementbereich eine Rolle zugewiesen werden. In diesem Beispiel wird gezeigt, wie Sie Rollen im Ressourcengruppenbereich zuweisen, da die meisten Anwendungen alle azure-Ressourcen in einer einzelnen Ressourcengruppe gruppieren.

Anweisungen Screenshot
Suchen Sie die Ressourcengruppe für Ihre Anwendung, 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.
A screenshot showing how to use the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to.
Wählen Sie auf der Seite für die Ressourcengruppe im linken Menü Die Option Zugriffssteuerung (IAM) aus. A screenshot of the resource group page showing the location of the Access control (IAM) menu item.
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.
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
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.
A screenshot showing how to filter and select role assignments to be added to the resource group.
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.
A screenshot showing the radio button to select to assign a role to an Azure AD group and the link used to select the group to assign the role to.
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 Azure AD-Gruppe ein, die Sie für die App erstellt haben.
  2. Wählen Sie die Azure AD-Gruppe für lokale Entwicklung aus, die Ihrer Anwendung zugeordnet ist.
Wählen Sie unten im Dialogfeld Auswählen aus, um den Vorgang fortzusetzen.
A screenshot showing how to filter for and select the Azure AD group for the application in the Select members dialog box.
Die Azure AD-Gruppe wird nun 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.
A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process.

4 : Festlegen von Anwendungsumgebungsvariablen

Das DefaultAzureCredential -Objekt 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 davon, für welchen Ansatz Sie sich entscheiden, müssen Sie die folgenden Umgebungsvariablen konfigurieren, 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 Anwendung übertragen werden, wenn sie bereitgestellt wird. Daher müssen Sie weiterhin 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": "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 unterstützt mehrere Authentifizierungsmethoden und bestimmt die zur Laufzeit verwendete Authentifizierungsmethode. Auf diese Weise kann Ihre App verschiedene Authentifizierungsmethoden in verschiedenen Umgebungen verwenden, ohne umgebungsspezifischen Code zu implementieren.

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

Um zu implementieren DefaultAzureCredential, fügen Sie zuerst die Azure.Identity Pakete und optional zu Microsoft.Extensions.Azure Ihrer Anwendung hinzu. Dazu können Sie entweder die Befehlszeile oder den NuGet-Paket-Manager verwenden.

Öffnen Sie eine Terminalumgebung Ihrer Wahl im Anwendungsprojektverzeichnis, und geben Sie den folgenden Befehl ein.

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

Auf Azure-Dienste wird im Allgemeinen über entsprechende Clientklassen aus dem SDK zugegriffen. Diese Klassen und Ihre eigenen benutzerdefinierten Dienste sollten in der Datei Program.cs registriert werden, damit über die Abhängigkeitsinjektion in der gesamten App darauf zugegriffen werden kann. Führen Sie innerhalb von Program.cs die folgenden Schritte aus, um Ihren Dienst und DefaultAzureCredential ordnungsgemäß einzurichten.

  1. Schließen Sie die Azure.Identity Namespaces und Microsoft.Extensions.Azure in eine using-Anweisung ein.
  2. Registrieren Sie den Azure-Dienst mithilfe relevanter Hilfsmethoden.
  3. Übergeben Sie eine Instanz des DefaultAzureCredential-Objekts an die UseCredential-Methode.

Ein Beispiel dafür wird im folgenden Codeausschnitt gezeigt.

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

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

Alternativ können Sie ihre Dienste auch direkter nutzen DefaultAzureCredential , ohne zusätzliche Azure-Registrierungsmethoden zu verwenden, wie unten zu sehen.

using Azure.Identity;

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

Wenn der obige Code während der lokalen Entwicklung auf Ihrer lokalen Arbeitsstation ausgeführt wird, sucht er in den Umgebungsvariablen nach einem Anwendungsdienstprinzipal oder in Visual Studio, VS Code, der Azure CLI oder Azure PowerShell nach einer Reihe von Entwickleranmeldeinformationen, von denen beide zur Authentifizierung der App bei Azure-Ressourcen während der lokalen Entwicklung verwendet werden können.

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.