Authentifizierung von NET-Apps bei Azure-Diensten während der lokalen Entwicklung mithilfe von Dienstprinzipien
Artikel
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.
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:
Geben Sie auf der Suchleiste oben im Azure-Portal App Registrierungen ein.
Wählen Sie im Menü, das unter der Suchleiste angezeigt wird, unter der Rubrik Dienste die Option App Registrierungen aus.
Wählen Sie auf der Seite „App-Registrierungen“ die Option + Neue Registrierung aus.
Füllen Sie auf der Seite Registrieren einer Anwendung das Formular wie folgt aus.
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.
Unterstützte Kontotypen → Nur Konten in diesem Organisationsverzeichnis.
Wählen Sie Registrieren aus, um Ihre App zu registrieren und den Anwendungsdienstprinzipal zu erstellen.
Auf der App-Registrierungsseite für Ihre App:
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.
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.
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.
Wählen Sie auf der Seite „Zertifikate und geheime Schlüssel“ + Neuer geheimer Clientschlüssel aus.
Das Dialogfeld Geheimer Clientschlüssel hinzufügen wird auf der rechten Seite der Seite angezeigt. In diesem Dialog:
Beschreibung → Geben Sie den Wert Current ein.
Läuft aus→ Wählen Sie einen Wert von 24 Monaten aus.
Wählen Sie Hinzufügen aus, um das Geheimnis hinzuzufügen.
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.
Verwenden Sie zunächst den Befehl az ad sp create-for-rbac , um einen neuen Dienstprinzipal für die App zu erstellen. Dadurch wird gleichzeitig auch die App-Registrierung für die App erstellt.
az ad sp create-for-rbac --name {service-principal-name}
Die Ausgabe dieses Befehls sollte wie im folgenden Beispiel aussehen. Es wird empfohlen, diese Ausgabe in eine temporäre Datei in einem Text-Editor zu kopieren, da Sie diese Werte in einem zukünftigen Schritt benötigen, da dies der einzige Ort ist, an dem der geheime Clientschlüssel (Kennwort) für den Dienstprinzipal angezeigt wird. Sie können aber bei Bedarf ein neues Kennwort hinzufügen, ohne den Dienstprinzipal oder vorhandene Kennwörter ungültig zu machen.
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.
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.
Wählen Sie auf der Seite Azure Active Directory im menü auf der linken Seite die Option Gruppen aus.
Wählen Sie auf der Seite Alle GruppenNeue Gruppeaus.
Auf der Seite Neue Gruppe :
Gruppentyp→ Security
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.
Gruppenbeschreibung → Eine Beschreibung des Zwecks der Gruppe.
Wählen Sie unter Mitglieder den Link Keine Mitglieder ausgewählt aus, um der Gruppe Mitglieder hinzuzufügen.
Das Dialogfeld Mitglieder hinzufügen wird angezeigt.
Verwenden Sie das Suchfeld, um die Liste der Namen der Auftraggeber in der Liste zu filtern.
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.
Wenn Sie fertig sind, wählen Sie die Schaltfläche Auswählen aus.
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.
Der Befehl az ad group create wird verwendet, um Gruppen in Azure Active Directory zu erstellen. Die --display-name- und --main-nickname-Parameter sind erforderlich. Der der Gruppe angegebene Name sollte auf dem Namen der Anwendung basieren. Es ist auch hilfreich, eine Zeichenfolge wie local-dev in den Namen der Gruppe aufzunehmen, um den Zweck der Gruppe anzugeben.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description \<group-description>
Zum Hinzufügen von Mitgliedern zur Gruppe benötigen Sie die Objekt-ID des Anwendungsdienstprinzipals, die sich von der Anwendungs-ID unterscheidet. Verwenden Sie die az ad sp list , um die verfügbaren Dienstprinzipale aufzulisten. Der --filter Parameterbefehl akzeptiert OData-Formatfilter und kann verwendet werden, um die Liste wie gezeigt zu filtern. Der --query Parameter beschränkt sich auf Spalten auf die von Interesse.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
Der Befehl az ad group member add kann dann verwendet werden, um Gruppen Mitglieder hinzuzufügen.
az ad group member add \
--group \<group-name> \
--member-id \<object-id> \
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.
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.
Wählen Sie auf der Seite für die Ressourcengruppe im linken Menü Die Option Zugriffssteuerung (IAM) aus.
Klicken Sie auf der Seite Zugriffssteuerungseinstellungen:
Klicken Sie auf die Registerkarte Rollenzuweisungen.
Wählen Sie im oberen Menü + Hinzufügen und aus dem dann angezeigten Dropdownmenü die Option Rollenzuweisung hinzufügen aus.
Auf der Seite Rollenzuweisung hinzufügen werden alle Rollen aufgelistet, die der Ressourcengruppe zugewiesen werden können.
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.
Wählen Sie die Rolle aus, die Sie zuweisen möchten.
Klicken Sie auf Weiter, um zum nächsten Bildschirm zu wechseln.
Auf der nächsten Seite Rollenzuweisung hinzufügen können Sie angeben, welchem Benutzer die Rolle zugewiesen werden soll.
Wählen Sie unter Zugriff zuweisendie Option Benutzer, Gruppe oder Dienstprinzipal aus.
Wählen Sie unter Mitglieder die Option +Mitglieder auswählen aus.
Auf der rechten Seite des Azure-Portal wird ein Dialogfeld geöffnet.
Im Dialogfeld Mitglieder auswählen :
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.
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.
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.
Einem Anwendungsdienstprinzipal wird mithilfe des Befehls az role assignment create eine Rolle in Azure zugewiesen.
az role assignment create --assignee "{appId}" \
--role "{roleName}" \
--resource-group "{resourceGroupName}"
Verwenden Sie den Befehl az role definition list , um die Rollennamen abzurufen, denen ein Dienstprinzipal zugewiesen werden kann.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Wenn Sie beispielsweise dem Anwendungsdienstprinzipal mit der appId des Lesens, Schreibens und Löschens 00000000-0000-0000-0000-000000000000 des Zugriffs auf Azure Storage-Blobcontainer und -Daten auf alle Speicherkonten in der Ressourcengruppe msdocs-dotnet-sdk-auth-example erlauben möchten, würden Sie den Anwendungsdienstprinzipal der Rolle Mitwirkender für Speicherblobdaten mithilfe des folgenden Befehls zuweisen.
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-dotnet-sdk-auth-example"
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.
Wenn Sie lokal mit Visual Studio arbeiten, können Umgebungsvariablen in der launch.json Datei 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.
Sie können Umgebungsvariablen für Windows über die Befehlszeile festlegen. Wenn Sie diesen Ansatz verwenden, sind die Werte jedoch für alle Anwendungen zugänglich, die unter diesem Betriebssystem ausgeführt werden. Dies kann Konflikte verursachen, wenn Sie nicht vorsichtig sind. Umgebungsvariablen können auf Benutzer- oder Systemebene festgelegt werden:
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"
# Set system environment variables - requires running as admin
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
PowerShell kann auch verwendet werden, um Umgebungsvariablen auf Benutzer- oder Computerebene festzulegen.
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
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.
Klicken Sie in Visual Studio mit der rechten Maustaste auf Ihren Projektknoten, und wählen Sie NuGet-Pakete verwalten aus. Suchen Sie im Suchfeld nach Azure.Identity, und installieren Sie das entsprechende Paket. Wiederholen Sie diesen Vorgang auch für das Microsoft.Extensions.Azure-Paket.
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.
Schließen Sie die Azure.Identity Namespaces und Microsoft.Extensions.Azure in eine using-Anweisung ein.
Registrieren Sie den Azure-Dienst mithilfe relevanter Hilfsmethoden.
Ü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.
Zusammenarbeit auf GitHub
Die Quelle für diesen Inhalt finden Sie auf GitHub, wo Sie auch Issues und Pull Requests erstellen und überprüfen können. Weitere Informationen finden Sie in unserem Leitfaden für Mitwirkende.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unter https://aka.ms/ContentUserFeedback.