Partilhar via


Autenticar aplicações C++ nos serviços Azure durante o desenvolvimento local usando contas de programador

Durante o desenvolvimento local, os aplicativos precisam se autenticar no Azure para usar diferentes serviços do Azure. Autentique-se localmente usando uma destas abordagens:

Este artigo explica como autenticar usando uma conta de desenvolvedor com ferramentas suportadas pela biblioteca de Identidade do Azure. Nas seções a seguir, você aprende:

  • Como usar os grupos do Microsoft Entra para gerenciar com eficiência as permissões para várias contas de desenvolvedor.
  • Como atribuir funções a contas de desenvolvedor para definir o escopo das permissões.
  • Como iniciar sessão em ferramentas de desenvolvimento local suportadas.
  • Como autenticar usando uma conta de desenvolvedor a partir do código do seu aplicativo.

Ferramentas de desenvolvedor suportadas para autenticação

Para que uma aplicação se autentique no Azure durante o desenvolvimento local usando as credenciais Azure do programador, o programador deve estar iniciado no Azure usando o Azure CLI.

A biblioteca Azure Identity pode detetar que o programador está autenticado nas ferramentas. A biblioteca pode, então, obter o token de acesso do Microsoft Entra através da ferramenta para autenticar a aplicação no Azure como um utilizador autenticado.

Essa abordagem aproveita as contas existentes do Azure do desenvolvedor para simplificar o processo de autenticação. No entanto, a conta de um desenvolvedor provavelmente tem mais permissões do que as exigidas pelo aplicativo, excedendo assim as permissões com as quais o aplicativo é executado em produção. Como alternativa, pode-se criar principais de serviço de aplicação para usar durante o desenvolvimento local, que podem ser limitados apenas ao acesso necessário para a aplicação.

Criar um grupo do Microsoft Entra para desenvolvimento local

Crie um grupo do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local, em vez de atribuir as funções a objetos principais de serviço individuais. Esta abordagem oferece as seguintes vantagens:

  • Cada desenvolvedor tem as mesmas funções atribuídas no nível do grupo.
  • Se uma nova função for necessária para o aplicativo, ela só precisará ser adicionada ao grupo do aplicativo.
  • Se um novo programador ingressar na equipa, um novo principal de serviço da aplicação será criado para o programador e adicionado ao grupo, garantindo que o programador tenha as permissões certas para trabalhar na aplicação.
  1. Navegue até a página de visão geral do Microsoft Entra ID no portal do Azure.

  2. Selecione Todos os grupos no menu à esquerda.

  3. Na página Grupos , selecione Novo grupo.

  4. Na página Novo de grupo, preencha os seguintes campos de formulário:

    • Tipo de grupo: Selecione Segurança.
    • Nome do grupo: insira um nome para o grupo que inclua uma referência ao nome do aplicativo ou ambiente.
    • Descrição do grupo: insira uma descrição que explique a finalidade do grupo.

    Uma captura de tela mostrando como criar um grupo no portal do Azure.

  5. Selecione o link Sem membros selecionados em Membros para adicionar membros ao grupo.

  6. No painel suspenso que se abre, procure o principal de serviço que criou anteriormente e selecione-o nos resultados filtrados. Escolha o botão Selecionar na parte inferior do painel para confirmar sua seleção.

  7. Selecione Criar na parte inferior da página Novo grupo para criar o grupo e retornar à página Todos os grupos . Se não vir o novo grupo listado, aguarde um momento e atualize a página.

Atribuir funções ao grupo

Em seguida, determine quais funções (permissões) seu aplicativo precisa em quais recursos e atribua essas funções ao grupo do Microsoft Entra que você criou. Os grupos podem receber uma função em um recurso, num grupo de recursos ou no âmbito de uma assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, já que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.

  1. No portal do Azure, navegue até a página Visão geral do grupo de recursos que contém seu aplicativo.

  2. Selecione Controle de acesso (IAM) na navegação à esquerda.

  3. Na página Controle de acesso (IAM), selecione + Adicionar e escolha Adicionar atribuição de função no menu suspenso. A página Adicionar atribuição de função fornece várias guias para configurar e atribuir funções.

  4. Na guia Função , use a caixa de pesquisa para localizar a função que você deseja atribuir. Selecione a função e, em seguida, escolha Avançar.

  5. Na aba Membros

    • Para o valor Atribuir acesso a , selecione Usuário, grupo ou entidade de serviço .
    • Para o valor Membros, escolha + Selecionar membros para abrir o painel flutuante Selecionar membros.
    • Procure o grupo do Microsoft Entra criado anteriormente e selecione-o nos resultados filtrados. Escolha e depois selecione para selecionar o grupo e fechar o painel de pop-up.
    • Selecione Revisar + atribuir no fundo do separador Membros.

    Uma captura de tela mostrando como atribuir uma função ao grupo Microsoft Entra.

  6. No separador Rever + atribuir, selecione Rever + atribuir na parte de baixo da página.

Entrar no Azure usando ferramentas de desenvolvedor

Inicie sessão no Azure usando uma das várias ferramentas para programadores que podem ser usadas para realizar autenticação no seu ambiente de desenvolvimento. A conta que você autenticar também deve existir no grupo do Microsoft Entra que você criou e configurou anteriormente.

Azure CLI (Interface de Linha de Comando da Azure)

Os desenvolvedores podem usar a CLI do Azure para autenticar. As aplicações que utilizam DefaultAzureCredential ou AzureCliCredential podem então usar esta conta para autenticar pedidos de aplicações.

Para autenticar com a CLI do Azure, execute o comando az login. Em um sistema com um navegador da Web padrão, a CLI do Azure inicia o navegador para autenticar o usuário.

az login

Para sistemas sem um navegador da Web padrão, o comando az login usa o fluxo de autenticação do código do dispositivo. O usuário também pode forçar a CLI do Azure a usar o fluxo de código do dispositivo em vez de iniciar um navegador especificando o argumento --use-device-code.

az login --use-device-code

Autenticar nos serviços do Azure a partir da sua aplicação

A biblioteca Azure Identity para C++ fornece várias credenciais adaptadas para suportar diferentes cenários e fluxos de autenticação Microsoft Entra. As etapas a seguir demonstram como usar DefaultAzureCredential ao trabalhar com contas de usuário localmente.

Implementar o código

A classe DefaultAzureCredential é uma sequência ordenada de mecanismos para autenticação ao Microsoft Entra ID. Cada mecanismo de autenticação é uma classe derivada da TokenCredential classe e é conhecido como credencial. Neste cenário, DefaultAzureCredential verifica sequencialmente se o programador iniciou sessão no Azure usando a CLI do Azure. Se o programador tiver a sessão iniciada no Azure CLI, então as credenciais usadas para iniciar sessão na ferramenta Azure CLI são usadas pela aplicação para autenticar no Azure. Para mais informações sobre como personalizar a cadeia de credenciais, veja Como personalizar o DefaultAzureCredential.

  1. Adicione o pacote azure-identity-cpp à sua aplicação usando vcpkg.

    vcpkg add port azure-identity-cpp
    
  2. Adicione as seguintes linhas no seu ficheiro CMake:

    find_package(azure-identity-cpp CONFIG REQUIRED)
    target_link_libraries(<your project name> PRIVATE Azure::azure-identity)
    
  3. Para qualquer código C++ que crie um objeto cliente Azure SDK na sua aplicação, deve-se:

    1. Inclua o azure/identity.hpp cabeçalho.

    2. Use DefaultAzureCredential ou AzureCliCredential para criar uma instância de credencial. Por exemplo:

      • Para usar DefaultAzureCredential, defina a variável AZURE_TOKEN_CREDENTIALS de ambiente para dev que indique que a aplicação está a correr num ambiente de desenvolvimento. Para obter mais informações, consulte Como personalizar DefaultAzureCredential.

        // Environment variable AZURE_TOKEN_CREDENTIALS=dev
        auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
        
      • Utilize AzureCliCredential para sempre usar o utilizador autenticado do Azure CLI.

        auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();
        
    3. Passe a instância de DefaultAzureCredential ou AzureCliCredential para o construtor cliente do Azure SDK.

    Um exemplo dessas etapas é mostrado no segmento de código a seguir. O exemplo cria um cliente Azure Storage Blob usando DefaultAzureCredential para autenticar no Azure.

    #include <azure/identity.hpp>
    #include <azure/storage/blobs.hpp>
    #include <iostream>
    #include <memory>
    
    int main() {
        try {
            // DefaultAzureCredential supports dev, test, and prod environments.
            // See documentation for details on customizing the credential chain:
            // https://learn.microsoft.com/azure/developer/cpp/sdk/authentication/credential-chains#defaultazurecredential-overview
            // In production, it's better to use a specific credential type so authentication is more predictable and easier to debug.
            // Here DefaultAzureCredential is used for local development and environment variable AZURE_TOKEN_CREDENTIALS=dev
    
            auto credential = std::make_shared<Azure::Identity::DefaultAzureCredential>(true);
    
            // Or use AzureCliCredential to always use the Azure CLI signed-in user to authenticate
            // auto credential = std::make_shared<Azure::Identity::AzureCliCredential>();
    
            // Create a client for the specified storage account
            std::string accountUrl = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/";
            Azure::Storage::Blobs::BlobServiceClient blobServiceClient(accountUrl, credential);
    
            // Get a reference to a container
            std::string containerName = "sample-container";
            auto containerClient = blobServiceClient.GetBlobContainerClient(containerName);
    
            // TODO: perform some action with the blob client
            // auto blobClient = containerClient.GetBlobClient("sample-blob");
            // auto downloadResult = blobClient.DownloadTo("path/to/local/file");
    
        } catch (const std::exception& ex) {
            std::cout << "Exception: " << ex.what() << std::endl;
            return 1;
        }
    
        return 0;
    }