Приложения часто требуют безопасных подключений между несколькими службами Azure одновременно. Например, экземпляр корпоративного приложения Azure может подключаться к нескольким разным учетным записям хранения, экземпляру базы данных SQL Azure, служебной шине и т. д.
Управляемые удостоверения — это рекомендуемый способ проверки подлинности для безопасных подключений без пароля между ресурсами Azure. Разработчикам не нужно вручную отслеживать и управлять множеством различных секретов для управляемых удостоверений, так как большинство этих задач обрабатываются внутри Azure. В этом учебнике рассматривается управление подключениями между несколькими службами с помощью управляемых удостоверений и клиентской библиотеки удостоверений Azure.
Сравните типы управляемых удостоверений
Azure предоставляет следующие типы управляемых удостоверений:
-
Назначаемые системой удостоверения напрямую связаны с одним ресурсом Azure. При включении в службе управляемого удостоверения, назначаемого системой, Azure создаст связанное удостоверение и выполнит обработку административных задач для этого удостоверения внутри. При удалении ресурса Azure удостоверение также удаляется.
-
Управляемые удостоверения, назначаемые пользователем, являются независимыми удостоверениями, созданными администратором, и могут быть связаны с одним или несколькими ресурсами Azure. Жизненный цикл удостоверения не зависит от этих ресурсов.
Вы можете узнать больше о лучших практиках и о том, когда использовать управляемые удостоверения, назначаемые системой, а когда — назначаемые пользователем, в рекомендациях по лучшим практикам использования управляемых удостоверений.
Обзор «DefaultAzureCredential»
Управляемые удостоверения наиболее легко реализуются в коде вашего приложения с помощью класса под названием DefaultAzureCredential
из библиотеки Azure Identity.
DefaultAzureCredential
поддерживает несколько механизмов проверки подлинности и автоматически определяет, какой из них следует использовать во время выполнения. Подробнее о DefaultAzureCredential
для следующих экосистем:
Подключение размещенного в Azure приложения к нескольким службам Azure
Представьте, что вам нужно подключить существующее приложение к нескольким службам и базам данных Azure с помощью бессерверных подключений. При этом приложение представляет собой веб-API ASP.NET Core, размещенное в службе приложений Azure, хотя приведенные ниже действия применимы и к другим средам размещения Azure, таким как Azure Spring Apps, виртуальные машины, контейнерные приложения и AKS.
Этот учебник применяется к следующим архитектурам, хотя его можно адаптировать и для многих других сценариев с минимальными изменениями конфигурации.
Ниже описаны действия по настройке приложения для использования управляемого удостоверения, назначаемого системой, и локальной учетной записи разработки для подключения к нескольким службам Azure.
Создать системно назначенное управляемое удостоверение
На портале Azure перейдите в размещенное приложение, которое вы хотите подключить к другим службам.
На странице обзора службы выберите Идентификация.
Переключите настройку Состояние в положение Вкл, чтобы включить управляемое удостоверение, назначаемое системой, для службы.
Назначайте роли управляемому удостоверению для каждой из подключенных служб
Перейдите на страницу обзора аккаунта хранения, к которому вы хотите предоставить доступ вашим идентификационным данным.
Выберите Контроль доступа (IAM) в навигации учетной записи хранения.
Нажмите + Добавить, а затем — Добавить назначение ролей.
В окне поиска Роль найдите Storage Blob Data Contributor, который предоставляет разрешения на выполнение операций чтения и записи с данными BLOB-объектов. Вы можете назначить любую роль, подходящую для вашего варианта использования. Выберите значение Участник данных BLOB-объектов хранилища в списке и нажмите кнопку Далее.
На экране Добавление назначения ролей для параметра Назначение доступа для выберите Управляемое удостоверение. Затем нажмите + Выбрать членов.
Во всплывающем окне найдите управляемое удостоверение, созданное путем ввода имени вашей службы приложений. Выберите системно назначенную идентификацию, а затем выберите «Выбрать», чтобы закрыть всплывающее меню.
Нажмите кнопку Далее несколько раз, пока не сможете нажать кнопку Проверить и назначить, чтобы завершить назначение роли.
Повторите этот процесс для других служб, к которым вы хотите подключиться.
Рекомендации к локальной разработке
Вы также можете включить доступ к ресурсам Azure для локальной разработки, назначив роли учетной записи пользователя так же, как вы назначили роли своему управляемому удостоверению.
После назначения управляемому удостоверению роли доступа к данным BLOB-объектов хранилища в разделе Назначить доступ на этот раз выберите Пользователь, группа или основной объект службы. Нажмите + Выбрать членов, чтобы снова открыть всплывающее меню.
Найдите учетную запись user@domain или группу безопасности Microsoft Entra, к которым вы хотите предоставить доступ по адресу электронной почты или имени, а затем выберите ее. Это должна быть та же учетная запись, используемая для входа в локальные инструменты разработки, например Visual Studio или Azure CLI.
Примечание.
Вы также можете назначить эти роли группе безопасности Microsoft Entra, если вы работаете над командой с несколькими разработчиками. Затем вы можете поместить в эту группу любого разработчика, которому требуется доступ для локальной разработки приложения.
Реализация кода приложения
В проекте установите Azure.Identity
пакет. Эта библиотека предоставляет DefaultAzureCredential
. Вы также можете добавить другие библиотеки Azure, относящиеся к вашему приложению. В этом примере добавлены пакеты Azure.Storage.Blobs
и Azure.Messaging.ServiceBus
для подключения к хранилищу BLOB-объектов и служебной шине соответственно.
dotnet add package Azure.Identity
dotnet add package Azure.Messaging.ServiceBus
dotnet add package Azure.Storage.Blobs
Создайте экземпляры клиентов службы для служб Azure, к которым должно подключаться ваше приложение. Следующий пример кода взаимодействует с хранилищем BLOB-объектов и Шиной обслуживания, используя соответствующих клиентов служб.
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");
В вашем проекте добавьте зависимость azure-identity
в файл pom.xml. Эта библиотека предоставляет DefaultAzureCredential
. Вы также можете добавить любые другие зависимости Azure, относящиеся к вашему приложению. В этом примере зависимости azure-storage-blob
и azure-messaging-servicebus
добавляются для взаимодействия с хранилищем BLOB-объектов и служебной шиной.
<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>
Создайте экземпляры клиентов для служб Azure, к которым должно подключаться ваше приложение. Следующий пример кода взаимодействует с хранилищем BLOB-объектов и шиной службы с помощью соответствующих клиентов служб.
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();
}
}
В вашем проекте вам нужно добавить только те зависимости служб, которые вы используете. В этом примере добавляются зависимости spring-cloud-azure-starter-storage-blob
и spring-cloud-azure-starter-servicebus
для подключения к хранилищу BLOB-объектов и службе шины.
<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>
Инициализируйте экземпляры клиентов служб для служб Azure, к которым вашему приложению необходимо подключиться. В следующих примерах выполняется подключение к хранилищу объектов BLOB и к служебной шине с использованием соответствующих клиентов служб.
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;
}
В проекте установите @azure/identity
пакет. Эта библиотека предоставляет DefaultAzureCredential
. В этом примере устанавливаются пакеты @azure/storage-blob
и @azure/service-bus
для взаимодействия с хранилищем блобов и служебной шиной.
npm install --save @azure/identity @azure/storage-blob @azure/service-bus
Создайте экземпляры клиентов для тех служб Azure, к которым должно подключаться ваше приложение. Следующий пример кода взаимодействует с хранилищем BLOB-объектов и службой шины с помощью соответствующих клиентов службы.
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
);
В проекте добавьте ссылку на azure-identity
пакет. Эта библиотека предоставляет DefaultAzureCredential
. Вы также можете добавить другие библиотеки Azure, относящиеся к вашему приложению. В этом примере пакеты azure-storage-blob
и azure-service-bus
добавляются для подключения к хранилищу BLOB-объектов и служебной шине соответственно.
pip install azure-identity azure-servicebus azure-storage-blob
Создайте экземпляры клиентов для служб Azure, которые требуются вашему приложению для подключения. Следующий пример кода взаимодействует с облачным хранилищем BLOB-объектов и служебной шиной с помощью соответствующих клиентов служб.
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)
При локальном DefaultAzureCredential
запуске этого кода выполняется поиск в цепочке учетных данных для первых доступных учетных данных.
Managed_Identity_Client_ID
Если переменная среды имеет значение NULL локально, используется учетные данные, соответствующие локально установленному средству разработчика. Например, Azure CLI или Visual Studio. Дополнительные сведения об этом процессе см. в разделе " Изучение DefaultAzureCredential".
При развертывании приложения в Azure DefaultAzureCredential
автоматически извлекает Managed_Identity_Client_ID
переменную из среды Служба приложений. Это значение становится доступным, когда управляемое удостоверение связано с вашим приложением.
Этот общий процесс гарантирует, что ваше приложение может безопасно работать локально и в Azure без каких-либо изменений кода.
Подключение нескольких приложений с помощью нескольких управляемых удостоверений
Хотя приложения в предыдущем примере разделяли одинаковые требования к доступу к службам, реальные среды часто более сложные. Рассмотрим сценарий, в котором несколько приложений подключаются к одной учетной записи хранения, но два приложения также получают доступ к разным службам или базам данных.
Чтобы настроить эту настройку в коде, убедитесь, что приложение регистрирует отдельные клиенты служб для подключения к каждой учетной записи хранения или базе данных. При настройке необходимо ссылаться на правильные идентификаторы клиента управляемого удостоверения для всех служб DefaultAzureCredential
. Следующие примеры кода настраивают следующие подключения к службе Azure:
- Два подключения к отдельным учетным записям хранения с помощью назначенной пользователем управляемой идентичности
- Подключение к Azure Cosmos DB и службам SQL Azure с помощью второго управляемого удостоверения, назначаемого пользователем. Это управляемое удостоверение используется, когда драйвер клиента SQL Azure разрешает его. Дополнительные сведения см. в комментариях кода.
В проекте установите необходимые пакеты. Библиотека удостоверений Azure предоставляет DefaultAzureCredential
.
dotnet add package Azure.Identity
dotnet add package Azure.Storage.Blobs
dotnet add package Microsoft.Azure.Cosmos
dotnet add package Microsoft.Data.SqlClient
Добавьте следующий код:
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();
}
Добавьте следующее в файл pom.xml :
<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>
Добавьте следующий код:
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();
}
}
}
Добавьте следующее в файл pom.xml :
<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>
Добавьте следующее в файл application.yml :
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;
Добавьте следующий код:
Примечание.
Spring Cloud Azure не поддерживает конфигурацию нескольких клиентов одного и того же сервиса, следующие примеры кода создают несколько бинов для этой ситуации.
@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;
}
В проекте установите необходимые пакеты. Библиотека удостоверений Azure предоставляет DefaultAzureCredential
.
npm install --save @azure/identity @azure/storage-blob @azure/cosmos tedious
Добавьте следующий код:
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();
В проекте установите необходимые пакеты. Библиотека удостоверений Azure предоставляет DefaultAzureCredential
.
pip install azure-identity azure-storage-blob azure-cosmos pyodbc
Добавьте следующий код:
from azure.cosmos import CosmosClient
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
import os, pyodbc, struct
# 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 a DefaultAzureCredential instance that configures the underlying
# ManagedIdentityCredential to use a user-assigned managed identity.
credential_databases = DefaultAzureCredential(
managed_identity_client_id=os.environ['Managed_Identity_Client_ID_Databases']
)
# Create an Azure Cosmos DB client
cosmos_client = CosmosClient(
os.environ['COSMOS_ENDPOINT'],
credential=credential_databases
)
# Connect to Azure SQL
token_bytes = credential_databases.get_token("https://database.windows.net/.default").token.encode("UTF-16-LE")
token_struct = struct.pack(f'<I{len(token_bytes)}s', len(token_bytes), token_bytes)
SQL_COPT_SS_ACCESS_TOKEN = 1256 # This connection option is defined by microsoft in msodbcsql.h
conn = pyodbc.connect(connection_string, attrs_before={SQL_COPT_SS_ACCESS_TOKEN: token_struct})
Вы также можете связать управляемое удостоверение, назначаемое пользователем, и управляемое удостоверение, назначаемое системой, одновременно с ресурсом. Это может быть полезно в сценариях, когда все приложения требуют доступа к одним общим службам, но одно из приложений также имеет определенную зависимость от дополнительной службы. Использование управляемого удостоверения, назначаемого системой, также гарантирует, что удостоверение, привязанное к конкретному приложению, удаляется при удалении приложения, что может помочь обеспечить очистку среды.
Эти типы сценариев подробно рассматриваются в рекомендациях по наилучшим методам использования управляемых удостоверений.
Следующие шаги
Из этого учебника вы узнали, как выполнить переход приложения на подключение без пароля. Дополнительные сведения см. в следующих ресурсах для изучения концепций, описанных в этой статье.