Partilhar via


Configurar conexões sem senha entre vários aplicativos e serviços do Azure

Os aplicativos geralmente exigem conexões seguras entre vários serviços do Azure simultaneamente. Por exemplo, uma instância corporativa do Serviço de Aplicativo do Azure pode se conectar a várias contas de armazenamento diferentes, uma instância do banco de dados SQL do Azure, um Service Bus e muito mais.

As identidades gerenciadas são a opção de autenticação recomendada para conexões seguras e sem senha entre os recursos do Azure. Os desenvolvedores não precisam rastrear e gerenciar manualmente muitos segredos diferentes para identidades gerenciadas, já que a maioria dessas tarefas é tratada internamente pelo Azure. Este tutorial explora como gerenciar conexões entre vários serviços usando identidades gerenciadas e a biblioteca de cliente do Azure Identity.

Comparar os tipos de identidades gerenciadas

O Azure fornece os seguintes tipos de identidades gerenciadas:

  • As identidades gerenciadas atribuídas ao sistema estão diretamente ligadas a um único recurso do Azure. Quando você habilita uma identidade gerenciada atribuída ao sistema em um serviço, o Azure cria uma identidade vinculada e manipula tarefas administrativas para essa identidade internamente. Quando o recurso do Azure é excluído, a identidade também é excluída.
  • As identidades gerenciadas atribuídas pelo usuário são identidades independentes criadas por um administrador e podem ser associadas a um ou mais recursos do Azure. O ciclo de vida da identidade é independente desses recursos.

Você pode ler mais sobre as melhores práticas e quando usar identidades geridas atribuídas pelo sistema versus identidades geridas atribuídas pelo usuário em recomendações de melhores práticas para identidades geridas.

Explore DefaultAzureCredential

As identidades gerenciadas são mais facilmente implementadas em seu código de aplicativo por meio de uma classe chamada DefaultAzureCredential da biblioteca de cliente do Azure Identity. DefaultAzureCredential suporta vários mecanismos de autenticação e determina automaticamente quais devem ser usados em tempo de execução. Saiba mais sobre DefaultAzureCredential para os seguintes ecossistemas:

Conectar um aplicativo hospedado pelo Azure a vários serviços do Azure

Imagine que você tem a tarefa de conectar um aplicativo existente a vários serviços e bancos de dados do Azure usando conexões sem senha. O aplicativo é uma API Web ASP.NET Core hospedada no Serviço de Aplicativo do Azure, embora as etapas abaixo também se apliquem a outros ambientes de hospedagem do Azure, como Aplicativos Azure Spring, Máquinas Virtuais, Aplicativos de Contêiner e AKS.

Este tutorial aplica-se às arquiteturas a seguir, embora possa ser adaptado a muitos outros cenários, bem como através de alterações mínimas de configuração.

Diagrama mostrando as relações de identidade atribuídas ao usuário.

As etapas a seguir demonstram como configurar um aplicativo para usar uma identidade gerenciada atribuída ao sistema e sua conta de desenvolvimento local para se conectar a vários Serviços do Azure.

Criar uma identidade gerenciada atribuída ao sistema

  1. No portal do Azure, navegue até o aplicativo hospedado que você gostaria de conectar a outros serviços.

  2. Na página de visão geral do serviço, selecione Identidade.

  3. Alterne a configuração Status para Ativado para habilitar uma identidade gerenciada atribuída ao sistema para o serviço.

    Captura de ecrã a mostrar como atribuir uma identidade gerida atribuída pelo sistema.

Atribuir funções à identidade gerenciada para cada serviço conectado

  1. Navegue até a página de visão geral da conta de armazenamento à qual você gostaria de conceder acesso à sua identidade.

  2. Selecione Controle de acesso (IAM) na navegação da conta de armazenamento.

  3. Escolha + Adicionar e, em seguida, Adicionar atribuição de função.

    Captura de ecrã a mostrar como localizar a secção do portal do Azure para atribuir uma função a uma identidade gerida atribuída pelo sistema.

  4. Na caixa Pesquisa de Função, procure por Colaborador de Dados de Blob de Armazenamento, que concede permissões para executar operações de leitura e gravação em dados de blob. Você pode atribuir qualquer função apropriada para seu caso de uso. Selecione o Contribuidor de Dados de Armazenamento de Blob na lista e clique em Avançar.

  5. Na tela Adicionar atribuição de função, para a opção Atribuir acesso a, selecione Identidade gerenciada. Em seguida, escolha +Selecionar membros.

  6. No submenu, procure a identidade gerenciada que você criou inserindo o nome do seu Serviço de Aplicativo. Selecione a identidade atribuída ao sistema e, em seguida, escolha Selecionar para encerrar o menu suspenso.

    Captura de ecrã a mostrar como atribuir uma função a uma identidade gerida atribuída pelo sistema no portal do Azure.

  7. Selecione Avançar algumas vezes até conseguir selecionar Revisar + atribuir para concluir a atribuição de função.

  8. Repita esse processo para os outros serviços aos quais você gostaria de se conectar.

Considerações sobre o desenvolvimento local

Também pode ativar o acesso aos recursos do Azure para desenvolvimento local atribuindo funções a uma conta de utilizador da mesma forma que atribuiu funções à sua identidade gerida.

  1. Depois de atribuir a função de Colaborador de Dados do Blob de Armazenamento à sua identidade gerida, em Atribuir acesso a, selecione Utilizador, grupo ou principal de serviço. Escolha + Selecionar membros para abrir novamente o menu suspenso.

  2. Procure a conta user@domain ou o grupo de segurança do Microsoft Entra ao qual você gostaria de conceder acesso por endereço de email ou nome e selecione-o. Essa deve ser a mesma conta que você usa para entrar em suas ferramentas de desenvolvimento local, como o Visual Studio ou a CLI do Azure.

Nota

Você também pode atribuir essas funções a um grupo de segurança do Microsoft Entra se estiver trabalhando em uma equipe com vários desenvolvedores. Em seguida, você pode colocar qualquer desenvolvedor dentro desse grupo que precise de acesso para desenvolver o aplicativo localmente.

Implementar o código do aplicativo

  1. No seu projeto, instale o Azure.Identity pacote. Esta biblioteca fornece DefaultAzureCredential. Também pode adicionar quaisquer outras bibliotecas do Azure que sejam relevantes para a sua aplicação. Neste exemplo, os Azure.Storage.Blobs pacotes e Azure.Messaging.ServiceBus são adicionados para se conectar ao Armazenamento de Blob e ao Service Bus, respectivamente.

    dotnet add package Azure.Identity
    dotnet add package Azure.Messaging.ServiceBus
    dotnet add package Azure.Storage.Blobs
    
  2. Instancie clientes de serviço para os serviços do Azure aos quais seu aplicativo deve se conectar. O exemplo de código a seguir interage com o Armazenamento de Blob e o Service Bus usando os clientes de serviço correspondentes.

    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");
    

Quando esse código é executado localmente, DefaultAzureCredential pesquisa sua cadeia de credenciais para as primeiras credenciais disponíveis. Se a Managed_Identity_Client_ID variável de ambiente for nula localmente, uma credencial correspondente a uma ferramenta de desenvolvedor instalada localmente será usada. Por exemplo, CLI do Azure ou Visual Studio. Para saber mais sobre esse processo, consulte a seção Explore DefaultAzureCredential.

Quando o aplicativo é implantado no Azure, DefaultAzureCredential recupera automaticamente a Managed_Identity_Client_ID variável do ambiente do Serviço de Aplicativo. Esse valor fica disponível quando uma identidade gerenciada é associada ao seu aplicativo.

Esse processo geral garante que seu aplicativo possa ser executado com segurança localmente e no Azure sem a necessidade de alterações de código.

Conecte vários aplicativos usando várias identidades gerenciadas

Embora os aplicativos no exemplo anterior compartilhassem os mesmos requisitos de acesso ao serviço, os ambientes do mundo real geralmente são mais matizados. Considere um cenário em que vários aplicativos se conectam às mesmas contas de armazenamento, mas dois dos aplicativos também acessam serviços ou bancos de dados diferentes.

Diagrama mostrando várias identidades gerenciadas atribuídas pelo usuário.

Para configurar essa configuração em seu código, certifique-se de que seu aplicativo registre clientes de serviço separados para se conectar a cada conta de armazenamento ou banco de dados. Refira-se aos IDs de cliente de identidade gerida corretos para cada serviço ao configurar DefaultAzureCredential. Os exemplos de código a seguir configuram essas conexões de serviço do Azure:

  • Duas conexões para contas de armazenamento separadas usando uma identidade gerenciada compartilhada atribuída pelo usuário
  • Uma conexão com o Azure Cosmos DB e os serviços SQL do Azure usando uma segunda identidade gerenciada atribuída pelo usuário. Essa identidade gerenciada é compartilhada quando o driver do cliente SQL do Azure permite isso. Para obter mais informações, consulte os comentários de código.
  1. No seu projeto, instale os pacotes necessários. A biblioteca de Identidade do Azure fornece DefaultAzureCredential.

    dotnet add package Azure.Identity
    dotnet add package Azure.Storage.Blobs
    dotnet add package Microsoft.Azure.Cosmos
    dotnet add package Microsoft.Data.SqlClient
    
  2. Adicione o seguinte ao seu código:

    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();
    }
    

Você também pode associar uma identidade gerenciada atribuída pelo usuário e uma identidade gerenciada atribuída pelo sistema a um recurso simultaneamente. Isso pode ser útil em cenários em que todos os aplicativos exigem acesso aos mesmos serviços compartilhados, mas um dos aplicativos também tem uma dependência específica de um serviço adicional. O uso de uma identidade gerenciada atribuída pelo sistema também garante que a identidade vinculada a esse aplicativo específico seja excluída quando o aplicativo for excluído, o que pode ajudar a manter seu ambiente limpo.

Diagrama mostrando identidades gerenciadas atribuídas pelo usuário e pelo sistema.

Esses tipos de cenários são explorados com mais profundidade nas recomendações de práticas recomendadas de identidade gerenciada.

Próximos passos

Neste tutorial, você aprendeu como migrar um aplicativo para conexões sem senha. Leia os seguintes recursos para explorar os conceitos discutidos neste artigo com mais profundidade: