Anwendungen erfordern häufig sichere Verbindungen zwischen mehreren Azure-Diensten gleichzeitig. Eine Azure App Service-Instanz eines Unternehmens kann beispielsweise eine Verbindung mit mehreren verschiedenen Speicherkonten, einer Azure SQL-Datenbankinstanz, einer Service Bus-Instanz und weiteren Diensten herstellen.
Verwaltete Identitäten sind die empfohlene Authentifizierungsoption für sichere, kennwortlose Verbindungen zwischen Azure-Ressourcen. Entwickler müssen nicht manuell viele verschiedene Geheimnisse für verwaltete Identitäten nachverfolgen und verwalten, da die meisten dieser Aufgaben intern von Azure erledigt werden. In diesem Tutorial erfahren Sie, wie Sie Verbindungen zwischen mehreren Diensten mithilfe von verwalteten Identitäten und der Azure Identity-Clientbibliothek verwalten können.
Vergleichen der Typen verwalteter Identitäten
Azure stellt die folgenden Typen von verwalteten Identitäten bereit:
-
Systemseitig zugewiesene verwaltete Identitäten werden direkt mit einer einzelnen Azure-Ressource verknüpft. Wenn Sie eine systemseitig zugewiesene verwaltete Identität für einen Dienst aktivieren, erstellt Azure eine verknüpfte Identität und verarbeitet administrative Aufgaben für diese Identität intern. Wenn die Azure-Ressource gelöscht wird, wird auch die Identität gelöscht.
-
Benutzerseitig zugewiesene verwaltete Identitäten sind unabhängige Identitäten, die von einem Administrator erstellt werden und einer oder mehreren Azure-Ressourcen zugeordnet werden können. Der Lebenszyklus der Identität ist unabhängig von diesen Ressourcen.
Weitere Informationen zu bewährten Methoden und dazu, wann systemseitig zugewiesene und wann benutzerseitig zugewiesene verwaltete Identitäten verwendet werden sollten, finden Sie in den Empfehlungen zu bewährten Methoden für verwaltete Identitäten.
Explore DefaultAzureCredential
Verwaltete Identitäten lassen sich am einfachsten über eine Klasse namens DefaultAzureCredential aus der Azure Identity-Clientbibliothek in Ihrem Anwendungscode implementieren.
DefaultAzureCredential unterstützt mehrere Authentifizierungsmechanismen und bestimmt automatisch, welcher Mechanismus zur Laufzeit verwendet werden soll. Erfahren Sie mehr über DefaultAzureCredential für die folgenden Ökosysteme:
Verbinden einer von Azure gehosteten App mit mehreren Azure-Diensten
Angenommen, Sie wurden damit beauftragt, eine vorhandene App über kennwortlose Verbindungen mit mehreren Azure-Diensten und Datenbanken zu verbinden. Die Anwendung ist eine in Azure App Service gehostete ASP.NET Core-Web-API. Die unten stehenden Schritte gelten jedoch auch für andere Azure-Hostingumgebungen, z. B. Azure Spring Apps, Azure Virtual Machines, Azure Container Apps und AKS.
Dieses Tutorial gilt für die folgenden Architekturen, kann jedoch durch minimale Konfigurationsänderungen auch an viele andere Szenarien angepasst werden.
Die folgenden Schritte veranschaulichen, wie Sie eine App so konfigurieren, dass eine systemseitig zugewiesene verwaltete Identität und Ihr lokales Entwicklungskonto verwendet werden, um eine Verbindung mit mehreren Azure-Diensten herzustellen.
Erstellen einer systemseitig zugewiesenen verwalteten Identität
Navigieren Sie im Azure-Portal zu der gehosteten Anwendung, die Sie mit anderen Diensten verbinden möchten.
Wählen Sie auf der Seite „Dienstübersicht“ die Option Identität aus.
Legen Sie die Einstellung Status auf Ein fest, um eine systemseitig zugewiesene verwaltete Identität für den Dienst zu aktivieren.
Zuweisen von Rollen zu verwalteten Identität für jeden verbundenen Dienst
Navigieren Sie zur Übersichtsseite des Speicherkontos, auf das Ihre Identität Zugriff erhalten soll.
Wählen Sie in der Speicherkontonavigation Zugriffssteuerung (IAM) aus.
Wählen Sie Hinzufügen und dann Rollenzuweisung hinzufügen aus.
Suchen Sie im Suchfeld Rolle nach Speicherblobdaten-Mitwirkender, der Berechtigungen zum Ausführen von Lese- und Schreibvorgängen für Blobdaten gewährt. Sie können eine beliebige Rolle zuweisen, die für Ihren Anwendungsfall geeignet ist. Wählen Sie Speicherblobdaten-Mitwirkender aus der Liste und dann Weiter aus.
Wählen Sie auf dem Bildschirm Rollenzuweisung hinzufügen für die Option Zugriff zuweisen zu die Option Verwaltete Identität aus. Wählen Sie dann + Mitglieder auswählen aus.
Suchen Sie im Flyout nach der verwalteten Identität, die Sie erstellt haben, indem Sie den Namen Ihrer App Service-Instanz eingeben. Wählen Sie die systemseitig zugewiesene Identität und dann Auswählen aus, um das Flyoutmenü zu schließen.
Wählen Sie mehrmals Weiter aus, bis Sie Überprüfen und zuweisen auswählen können, um die Rollenzuweisung abzuschließen.
Wiederholen Sie diesen Vorgang für die anderen Dienste, mit denen Sie eine Verbindung herstellen möchten.
Überlegungen zur lokalen Entwicklung
Sie können auch den Zugriff auf Azure-Ressourcen für die lokale Entwicklung aktivieren, indem Sie einem Benutzerkonto auf die gleiche Weise Rollen zuweisen, wie Sie Ihrer verwalteten Identität Rollen zugewiesen haben.
Nachdem Sie die Rolle Speicherblobdaten-Mitwirkender ihrer verwalteten Identität zugewiesen haben, wählen Sie unter Zugriff zuweisen zu dieses Mal Benutzer, Gruppe oder Dienstprinzipal aus. Wählen Sie + Mitglieder auswählen aus, um das Flyoutmenü erneut zu öffnen.
Suchen Sie nach dem Konto user@domain oder der Microsoft Entra-Sicherheitsgruppe, dem bzw. der Sie per E-Mail-Adresse oder Namen Zugriff erteilen möchten, und wählen Sie das Konto bzw. die Sicherheitsgruppe aus. Dabei sollte es sich um dasselbe Konto handeln, mit dem Sie sich bei Ihrem lokalen Entwicklungstool anmelden, z. B. Visual Studio oder die Azure CLI.
Hinweis
Sie können diese Rollen auch einer Microsoft Entra-Sicherheitsgruppe zuweisen, wenn Sie in einem Team mit mehreren Entwicklern arbeiten. Sie können dann jeden Entwickler, der Zugriff benötigt, in diese Gruppe aufnehmen, um an der lokalen Entwicklung der App teilzunehmen.
Implementieren des Anwendungscodes
Installieren Sie in Ihrem Projekt das Paket Azure.Identity. Diese Bibliothek stellt DefaultAzureCredential bereit. Sie können auch alle anderen Azure-Bibliotheken hinzufügen, die für Ihre App relevant sind. In diesem Beispiel werden die Pakete Azure.Storage.Blobs und Azure.Messaging.ServiceBus hinzugefügt, um eine Verbindung mit Blob Storage bzw. Service Bus herzustellen.
dotnet add package Azure.Identity
dotnet add package Azure.Messaging.ServiceBus
dotnet add package Azure.Storage.Blobs
Instanziieren Sie Dienstclients für die Azure-Dienste, mit denen Ihre App eine Verbindung herstellen muss. Das folgende Codebeispiel interagiert mithilfe der entsprechenden Dienstclients mit Blob Storage und Service Bus.
using Azure.Identity;
using Azure.Messaging.ServiceBus;
using Azure.Storage.Blobs;
// Create DefaultAzureCredential instance that uses system-assigned managed identity
// in the underlying ManagedIdentityCredential.
DefaultAzureCredential credential = new();
BlobServiceClient blobServiceClient = new(
new Uri("https://<your-storage-account>.blob.core.windows.net"),
credential);
ServiceBusClient serviceBusClient = new("<your-namespace>", credential);
ServiceBusSender sender = serviceBusClient.CreateSender("producttracking");
Fügen Sie in Ihrem Projekt der Datei pom.xml die Abhängigkeit azure-identity hinzu. Diese Bibliothek stellt DefaultAzureCredential bereit. Sie können auch andere Azure-Abhängigkeiten hinzufügen, die für Ihre App relevant sind. In diesem Beispiel werden die Abhängigkeiten azure-storage-blob und azure-messaging-servicebus hinzugefügt, um mit Blob Storage und Service Bus zu interagieren.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-sdk-bom</artifactId>
<version>1.2.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-messaging-servicebus</artifactId>
</dependency>
</dependencies>
Instanziieren Sie Dienstclients für die Azure-Dienste, mit denen Ihre App eine Verbindung herstellen muss. Das folgende Codebeispiel interagiert mithilfe der entsprechenden Dienstclients mit Blob Storage und Service Bus.
class Demo {
public static void main(String[] args) {
// Create DefaultAzureCredential instance that uses system-assigned managed identity
// in the underlying ManagedIdentityCredential.
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
BlobServiceClient blobServiceClient = new BlobServiceClientBuilder()
.endpoint("https://<your-storage-account>.blob.core.windows.net")
.credential(credential)
.buildClient();
ServiceBusClientBuilder clientBuilder = new ServiceBusClientBuilder()
.credential(credential);
ServiceBusSenderClient serviceBusSenderClient = clientBuilder.sender()
.queueName("producttracking")
.buildClient();
}
}
In Ihrem Projekt müssen Sie nur Dienstabhängigkeiten hinzufügen, die Sie verwenden. In diesem Beispiel werden die Abhängigkeiten spring-cloud-azure-starter-storage-blob und spring-cloud-azure-starter-servicebus hinzugefügt, um eine Verbindung mit Blob Storage und Service Bus herzustellen.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-dependencies</artifactId>
<version>4.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-servicebus</artifactId>
</dependency>
</dependencies>
Instanziieren Sie Dienstclients für die Azure-Dienste, mit denen Ihre App eine Verbindung herstellen muss. In den folgenden Beispielen wird mithilfe der entsprechenden Dienstclients eine Verbindung mit Blob Storage und Service Bus hergestellt.
spring:
cloud:
azure:
servicebus:
namespace: <service-bus-name>
entity-name: <service-bus-entity-name>
entity-type: <service-bus-entity-type>
storage:
blob:
account-name: <storage-account-name>
@Service
public class ExampleService {
@Autowired
private BlobServiceClient blobServiceClient;
@Autowired
private ServiceBusSenderClient serviceBusSenderClient;
}
Installieren Sie in Ihrem Projekt das Paket @azure/identity. Diese Bibliothek stellt DefaultAzureCredential bereit. In diesem Beispiel werden die Pakete @azure/storage-blob und @azure/service-bus installiert, um mit Blob Storage und Service Bus zu interagieren.
npm install --save @azure/identity @azure/storage-blob @azure/service-bus
Instanziieren Sie Dienstclients für die Azure-Dienste, mit denen Ihre App eine Verbindung herstellen muss. Das folgende Codebeispiel interagiert mithilfe der entsprechenden Dienstclients mit Blob Storage und Service Bus.
import { DefaultAzureCredential } from "@azure/identity";
import { BlobServiceClient } from "@azure/storage-blob";
import { ServiceBusClient } from "@azure/service-bus";
// Azure resource names
const storageAccount = process.env.AZURE_STORAGE_ACCOUNT_NAME;
const serviceBusNamespace = process.env.AZURE_SERVICE_BUS_NAMESPACE;
// Create DefaultAzureCredential instance that uses system-assigned managed identity
// in the underlying ManagedIdentityCredential.
const credential = new DefaultAzureCredential();
// Create client for Blob Storage
const blobServiceClient = new BlobServiceClient(
`https://${storageAccount}.blob.core.windows.net`,
credential
);
// Create client for Service Bus
const serviceBusClient = new ServiceBusClient(
`https://${serviceBusNamespace}.servicebus.windows.net`,
credential
);
Fügen Sie in Ihrem Projekt einen Verweis auf das Paket azure-identity hinzu. Diese Bibliothek stellt DefaultAzureCredential bereit. Sie können auch alle anderen Azure-Bibliotheken hinzufügen, die für Ihre App relevant sind. In diesem Beispiel werden die Pakete azure-storage-blob und azure-service-bus hinzugefügt, um eine Verbindung mit Blob Storage bzw. Service Bus herzustellen.
pip install azure-identity azure-servicebus azure-storage-blob
Instanziieren Sie Dienstclients für die Azure-Dienste, mit denen Ihre App eine Verbindung herstellen muss. Das folgende Codebeispiel interagiert mithilfe der entsprechenden Dienstclients mit Blob Storage und Service Bus.
from azure.identity import DefaultAzureCredential
from azure.servicebus import ServiceBusClient, ServiceBusMessage
from azure.storage.blob import BlobServiceClient
import os
# Create DefaultAzureCredential instance that uses system-assigned managed identity
# in the underlying ManagedIdentityCredential.
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<my-storage-account-name>.blob.core.windows.net/",
credential=credential
)
fully_qualified_namespace = os.environ['SERVICEBUS_FULLY_QUALIFIED_NAMESPACE']
queue_name = os.environ['SERVICE_BUS_QUEUE_NAME']
with ServiceBusClient(fully_qualified_namespace, credential) as service_bus_client:
with service_bus_client.get_queue_sender(queue_name) as sender:
# Sending a single message
single_message = ServiceBusMessage("Single message")
sender.send_messages(single_message)
Wenn dieser Code lokal ausgeführt wird, sucht DefaultAzureCredential in seiner Anmeldeinformationskette nach den ersten verfügbaren Anmeldeinformationen. Wenn die Umgebungsvariable Managed_Identity_Client_ID lokal NULL ist, werden Anmeldeinformationen verwendet, die einem lokal installierten Entwicklertool entsprechen. Dabei kann es sich z. B. um die Azure-Befehlszeilenschnittstelle (Command Line Interface, CLI) oder Visual Studio handeln. Weitere Informationen zu diesem Prozess finden Sie im Abschnitt Erkunden von DefaultAzureCredential.
Wenn die Anwendung in Azure bereitgestellt wird, ruft DefaultAzureCredential automatisch die Variable Managed_Identity_Client_ID aus der App Service-Umgebung ab. Dieser Wert wird verfügbar, wenn eine verwaltete Identität Ihrer App zugeordnet wird.
Dieser Gesamtprozess stellt sicher, dass Ihre App lokal und in Azure sicher ausgeführt werden kann, ohne dass Codeänderungen erforderlich sind.
Verbinden mehrerer Apps mit mehreren verwalteten Identitäten
Obwohl die Apps im vorherigen Beispiel die gleichen Anforderungen an den Dienstzugriff haben, sind reale Umgebungen oft vielschichtiger. Betrachten Sie ein Szenario, in dem mehrere Apps eine Verbindung mit den gleichen Speicherkonten herstellen, zwei der Apps aber auch auf unterschiedliche Dienste oder Datenbanken zugreifen.
Um dieses Setup in Ihrem Code zu konfigurieren, müssen Sie sicherstellen, dass Ihre Anwendung für jede Verbindung mit einem Speicherkonto oder einer Datenbank separate Dienstclients registriert. Verweisen Sie beim Konfigurieren von DefaultAzureCredential für jeden Dienst auf die richtigen Client-IDs der verwalteten Identität. Die folgenden Codebeispiele konfigurieren diese Azure-Dienstverbindungen:
- Zwei Verbindungen mit separaten Speicherkonten über eine gemeinsame benutzerseitig zugewiesene verwaltete Identität
- Eine Verbindung mit Azure Cosmos DB- und Azure SQL-Diensten über eine zweite benutzerseitig zugewiesene verwaltete Identität. Diese verwaltete Identität wird freigegeben, wenn der Azure SQL-Clienttreiber dies zulässt. Weitere Informationen finden Sie in den Codekommentaren.
Installieren Sie in Ihrem Projekt die erforderlichen Pakete. Die Azure Identity-Bibliothek stellt DefaultAzureCredential bereit.
dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Microsoft.Azure.Cosmos
dotnet add package Microsoft.Data.SqlClient
Fügen Sie Ihrem Code Folgendes hinzu:
using Azure.Core;
using Azure.Identity;
using Azure.Storage.Blobs;
using Microsoft.Azure.Cosmos;
using Microsoft.Data.SqlClient;
string clientIdStorage =
Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Storage")!;
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
DefaultAzureCredential credentialStorage = new(
new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientIdStorage,
});
// First Blob Storage client
BlobServiceClient blobServiceClient1 = new(
new Uri("https://<receipt-storage-account>.blob.core.windows.net"),
credentialStorage);
// Second Blob Storage client
BlobServiceClient blobServiceClient2 = new(
new Uri("https://<contract-storage-account>.blob.core.windows.net"),
credentialStorage);
string clientIdDatabases =
Environment.GetEnvironmentVariable("Managed_Identity_Client_ID_Databases")!;
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
DefaultAzureCredential credentialDatabases = new(
new DefaultAzureCredentialOptions
{
ManagedIdentityClientId = clientIdDatabases,
});
// Create an Azure Cosmos DB client
CosmosClient cosmosClient = new(
Environment.GetEnvironmentVariable("COSMOS_ENDPOINT", EnvironmentVariableTarget.Process),
credentialDatabases);
// Open a connection to Azure SQL
string connectionString =
$"Server=<azure-sql-hostname>.database.windows.net;User Id={clientIdDatabases};Authentication=Active Directory Default;Database=<database-name>";
using (SqlConnection connection = new(connectionString)
{
AccessTokenCallback = async (authParams, cancellationToken) =>
{
const string defaultScopeSuffix = "/.default";
string scope = authParams.Resource.EndsWith(defaultScopeSuffix)
? authParams.Resource
: $"{authParams.Resource}{defaultScopeSuffix}";
AccessToken token = await credentialDatabases.GetTokenAsync(
new TokenRequestContext([scope]),
cancellationToken);
return new SqlAuthenticationToken(token.Token, token.ExpiresOn);
}
})
{
connection.Open();
}
Fügen Sie der Datei pom.xml Folgendes hinzu:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-sdk-bom</artifactId>
<version>1.2.5</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-storage-blob</artifactId>
</dependency>
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-cosmos</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>11.2.1.jre17</version>
</dependency>
</dependencies>
Fügen Sie Ihrem Code Folgendes hinzu:
class Demo {
public static void main(String[] args) {
String clientIdStorage = System.getenv("Managed_Identity_Client_ID_Storage");
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
DefaultAzureCredential credentialStorage = new DefaultAzureCredentialBuilder()
.managedIdentityClientId(clientIdStorage)
.build();
// First Blob Storage client
BlobServiceClient blobServiceClient1 = new BlobServiceClientBuilder()
.endpoint("https://<receipt-storage-account>.blob.core.windows.net")
.credential(credentialStorage)
.buildClient();
// Second Blob Storage client
BlobServiceClient blobServiceClient2 = new BlobServiceClientBuilder()
.endpoint("https://<contract-storage-account>.blob.core.windows.net")
.credential(credentialStorage)
.buildClient();
String clientIdDatabases = System.getenv("Managed_Identity_Client_ID_Databases");
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
DefaultAzureCredential credentialDatabases = new DefaultAzureCredentialBuilder()
.managedIdentityClientId(clientIdDatabases)
.build()
// Create an Azure Cosmos DB client
CosmosClient cosmosClient = new CosmosClientBuilder()
.endpoint("https://<cosmos-db-account>.documents.azure.com:443/")
.credential(credentialDatabases)
.buildClient();
// Open a connection to Azure SQL using a managed identity.
// The DefaultAzureCredential instance stored in the credentialDatabases variable can't be
// used here, so sharing isn't possible between Cosmos DB and Azure SQL.
String connectionUrl = "jdbc:sqlserver://<azure-sql-hostname>.database.windows.net:1433;"
+ "database=<database-name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database"
+ ".windows.net;loginTimeout=30;Authentication=ActiveDirectoryMSI;";
try {
Connection connection = DriverManager.getConnection(connectionUrl);
Statement statement = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Fügen Sie der Datei pom.xml Folgendes hinzu:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-dependencies</artifactId>
<version>4.5.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-storage-blob</artifactId>
</dependency>
<dependency>
<groupId>com.azure.spring</groupId>
<artifactId>spring-cloud-azure-starter-cosmos</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
</dependencies>
Fügen Sie der Datei application.yml Folgendes hinzu:
spring:
cloud:
azure:
cosmos:
endpoint: https://<cosmos-db-account>.documents.azure.com:443/
credential:
client-id: <Managed_Identity_Client_ID_Databases>
managed-identity-enabled: true
storage:
blob:
endpoint: https://<contract-storage-account>.blob.core.windows.net
credential:
client-id: <Managed_Identity_Client_ID_Storage>
managed-identity-enabled: true
datasource:
url: jdbc:sqlserver://<azure-sql-hostname>.database.windows.net:1433;database=<database-name>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;Authentication=ActiveDirectoryMSI;
Fügen Sie Ihrem Code Folgendes hinzu:
Hinweis
Spring Cloud Azure unterstützt das Konfigurieren mehrerer Clients desselben Diensts nicht. Die folgenden Codebeispiele erstellen mehrere Beans für diese Situation.
@Configuration
public class AzureStorageConfiguration {
@Bean("secondBlobServiceClient")
public BlobServiceClient secondBlobServiceClient(BlobServiceClientBuilder builder) {
return builder.endpoint("https://<receipt-storage-account>.blob.core.windows.net")
.buildClient();
}
@Bean("firstBlobServiceClient")
public BlobServiceClient firstBlobServiceClient(BlobServiceClientBuilder builder) {
return builder.buildClient();
}
}
@Service
public class ExampleService {
@Autowired
@Qualifier("firstBlobServiceClient")
private BlobServiceClient blobServiceClient1;
@Autowired
@Qualifier("secondBlobServiceClient")
private BlobServiceClient blobServiceClient2;
@Autowired
private CosmosClient cosmosClient;
@Autowired
private JdbcTemplate jdbcTemplate;
}
Installieren Sie in Ihrem Projekt die erforderlichen Pakete. Die Azure Identity-Bibliothek stellt DefaultAzureCredential bereit.
npm install --save @azure/identity @azure/storage-blob @azure/cosmos tedious
Fügen Sie Ihrem Code Folgendes hinzu:
import { DefaultAzureCredential } from "@azure/identity";
import { BlobServiceClient } from "@azure/storage-blob";
import { CosmosClient } from "@azure/cosmos";
import { Connection } from "tedious";
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
const credentialStorage = new DefaultAzureCredential({
managedIdentityClientId: process.env.MANAGED_IDENTITY_CLIENT_ID_STORAGE
});
// First Blob Storage client
const blobServiceClient1 = new BlobServiceClient(
`https://${process.env.AZURE_STORAGE_ACCOUNT_NAME_1}.blob.core.windows.net`,
credentialStorage
);
// Second Blob Storage client
const blobServiceClient2 = new BlobServiceClient(
`https://${process.env.AZURE_STORAGE_ACCOUNT_NAME_2}.blob.core.windows.net`,
credentialStorage
);
// Create a DefaultAzureCredential instance that configures the underlying
// ManagedIdentityCredential to use a user-assigned managed identity.
const credentialDatabases = new DefaultAzureCredential({
managedIdentityClientId: process.env.MANAGED_IDENTITY_CLIENT_ID_DATABASES
});
// Create an Azure Cosmos DB client
const cosmosClient = new CosmosClient({
endpoint: process.env.COSMOS_ENDPOINT,
credential: credentialDatabases
});
// Configure connection and connect to Azure SQL
const config = {
server: process.env.AZURE_SQL_SERVER,
authentication: {
type: 'azure-active-directory-access-token',
options: {
token: credentialDatabases.getToken("https://database.windows.net//.default").token
}
},
options: {
database: process.env.AZURE_SQL_DATABASE,
encrypt: true
}
};
const connection = new Connection(config);
connection.connect();
Installieren Sie in Ihrem Projekt die erforderlichen Pakete. Die Azure Identity-Bibliothek stellt DefaultAzureCredential bereit.
pip install azure-identity azure-storage-blob azure-cosmos mssql-python
Fügen Sie Ihrem Code Folgendes hinzu:
from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
from mssql_python import connect
import os
# Create a DefaultAzureCredential instance that configures the underlying
# ManagedIdentityCredential to use a user-assigned managed identity.
credential_storage = DefaultAzureCredential(
managed_identity_client_id=os.environ['Managed_Identity_Client_ID_Storage']
)
# First Blob Storage client
blob_service_client_1 = BlobServiceClient(
account_url="https://<receipt-storage-account>.blob.core.windows.net/",
credential=credential_storage
)
# Second Blob Storage client
blob_service_client_2 = BlobServiceClient(
account_url="https://<contract-storage-account>.blob.core.windows.net/",
credential=credential_storage
)
# Create an Azure Cosmos DB client
# Note: For Cosmos DB, we still need DefaultAzureCredential
credential_databases = DefaultAzureCredential(
managed_identity_client_id=os.environ['Managed_Identity_Client_ID_Databases']
)
cosmos_client = CosmosClient(
os.environ['COSMOS_ENDPOINT'],
credential=credential_databases
)
# Connect to Azure SQL using mssql-python with managed identity
# The driver handles authentication internally when using ActiveDirectoryMSI
connection_string = f"Server=<your-server>.database.windows.net;Database=<your-database>;UID={os.environ['Managed_Identity_Client_ID_Databases']};Authentication=ActiveDirectoryMSI;Encrypt=yes;"
conn = connect(connection_string)
Sie können einer Ressource auch gleichzeitig eine benutzerseitig zugewiesene verwaltete Identität und eine systemseitig zugewiesene verwaltete Identität zuordnen. Dies kann in Szenarien nützlich sein, in denen alle Apps Zugriff auf dieselben freigegebenen Dienste benötigen, eine der Apps jedoch auch eine spezifische Abhängigkeit von einem zusätzlichen Dienst aufweist. Durch die Verwendung einer systemseitig zugewiesenen verwalteten Identität wird außerdem sichergestellt, dass die an die jeweilige App gebundene Identität beim Löschen der App gelöscht wird, was die Bereinigung Ihrer Umgebung erleichtern kann.
In den Empfehlungen zu bewährten Methoden für verwaltete Identitäten werden solche Szenarien ausführlicher erläutert.
Nächste Schritte
In diesem Tutorial haben Sie gelernt, wie Sie eine Anwendung zu kennwortlosen Verbindungen migrieren. Lesen Sie die folgenden Artikel, um mehr über die Konzepte zu erfahren, die in diesem Artikel vorgestellt wurden: