Tutorial: Usar uma identidade gerenciada para conectar Key Vault a um aplicativo Web Azure no .NET

Azure Key Vault fornece uma maneira de armazenar credenciais e outros segredos com maior segurança. Mas o seu código precisa se autenticar ao Key Vault para recuperá-las. Identidades gerenciadas para recursos Azure resolvem esse problema dando aos serviços de Azure uma identidade gerenciada automaticamente em Microsoft Entra ID. Seu código usa essa identidade para autenticar em qualquer serviço que dê suporte à autenticação Microsoft Entra, incluindo Key Vault, sem inserir credenciais no código.

Neste tutorial, você cria e implanta um aplicativo Web Azure para Serviço de Aplicativo do Azure e, em seguida, usa uma identidade gerenciada para autenticar o aplicativo em um cofre de chaves usando a biblioteca de clientes Azure Key Vault secreta para .NET e o CLI do Azure. Os mesmos princípios se aplicam se você usar outro idioma, Azure PowerShell ou o portal Azure.

Para obter mais informações sobre aplicativos Web e implantação do Serviço de Aplicativo, consulte:

Pré-requisitos

Para concluir este tutorial, você precisará:

Se você já tiver um aplicativo web implantado no Serviço de Aplicativo do Azure, vá para Configurar o aplicativo web para se conectar ao Key Vault e Modificar o aplicativo para acessar o Key Vault.

Criar um aplicativo .NET Core

Nesta etapa, configure o projeto de .NET local.

Em uma janela de terminal, crie um diretório nomeado akvwebapp e alterne para ele:

mkdir akvwebapp
cd akvwebapp

Crie um aplicativo Web .NET usando o novo comando Web dotnet:

dotnet new web

Execute o aplicativo localmente para ver a aparência dele antes de implantá-lo no Azure:

dotnet run

Em um navegador da Web, abra o aplicativo em http://localhost:5000. Você verá a mensagem "Olá, Mundo!" do aplicativo de exemplo.

Para obter mais informações sobre como criar aplicativos Web, consulte Criar um aplicativo Web ASP.NET Core no Serviço de Aplicativo do Azure.

Implantar o aplicativo no Azure

Nesta etapa, implante o aplicativo .NET no Serviço de Aplicativo do Azure usando a implantação por ZIP. A implantação por ZIP é o mecanismo de implantação baseado em pacotes recomendado para o App Service. Para entrega contínua do controle do código-fonte, use GitHub Actions ou Azure DevOps Pipelines.

Criar um grupo de recursos

Crie um grupo de recursos para conter o cofre de chaves e o aplicativo Web usando az group create:

az group create --name "<resource-group>" --location "EastUS"

Criar um plano do Serviço de Aplicativo

Crie um plano do Serviço de Aplicativo usando az appservice plan create. O exemplo a seguir cria um plano nomeado myAppServicePlan na camada gratuita (FREE):

az appservice plan create --name myAppServicePlan --resource-group <resource-group> --sku FREE

Criar um aplicativo Web

Crie um aplicativo Web do Azure no plano myAppServicePlan.

Importante

Como um cofre de chaves, um aplicativo Web Azure deve ter um nome globalmente exclusivo. Substitua <webapp-name> pelo nome do aplicativo Web.

az webapp create --resource-group "<resource-group>" --plan "myAppServicePlan" --name "<webapp-name>"

Vá para o novo aplicativo para confirmar se ele está em execução:

https://<webapp-name>.azurewebsites.net

Você verá a página padrão de um novo aplicativo Web Azure.

Implante seu aplicativo local com implantação por ZIP

No diretório do projeto akvwebapp, compile o projeto e crie um arquivo ZIP de implantação:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..

Tip

Em Windows semzip, use o PowerShell: Compress-Archive -Path .\publish\* -DestinationPath .\akvwebapp.zip.

Implante o zip em seu aplicativo Web usando az webapp deploy:

az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Atualize o aplicativo implantado no navegador da Web:

https://<webapp-name>.azurewebsites.net

Você vê a mesma mensagem "Olá, Mundo!" que viu em http://localhost:5000.

Configurar o aplicativo Web para se conectar ao Key Vault

Nesta seção, você permitirá que o aplicativo Web acesse Key Vault e atualize o código do aplicativo para recuperar um segredo.

Criar e atribuir acesso a uma identidade gerenciada

Use uma identidade gerenciada para autenticar o aplicativo Web para Key Vault. Uma identidade gerenciada remove a necessidade de você gerenciar credenciais no código.

Crie a identidade do aplicativo usando az webapp identity assign:

az webapp identity assign --name "<webapp-name>" --resource-group "<resource-group>"

O comando retorna um snippet JSON semelhante a este:

{
  "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
  "type": "SystemAssigned"
}

Para obter permissões para o cofre de chaves por meio do RBAC (controle de acesso baseado em função), atribua uma função ao seu UPN (nome principal do usuário) usando o comando da CLI do Azure az role assignment create.

az role assignment create --role "Key Vault Secrets User" --assignee "<upn>" --scope "/subscriptions/<subscription-id>/resourceGroups/myResourceGroup/providers/Microsoft.KeyVault/vaults/<vault-name>"

Substitua <upn>, <subscription-id>e <vault-name> com seus valores reais. Se você usou um nome de grupo de recursos diferente, substitua "myResourceGroup" também. Seu UPN normalmente estará no formato de um endereço de email (por exemplo, username@domain.com).

Modificar o aplicativo para acessar o cofre de chaves

Este tutorial usa a biblioteca de cliente de segredos do Azure Key Vault. Você também pode usar a biblioteca de clientes de certificado Azure Key Vault ou a biblioteca de clientes de chave Azure Key Vault.

Instalar os pacotes

Na janela do terminal, instale a biblioteca de clientes de segredos do Azure Key Vault e a biblioteca de clientes do Azure Identity:

dotnet add package Azure.Identity
dotnet add package Azure.Security.KeyVault.Secrets

Atualizar o código

Abra Program.cs em seu projeto akvwebapp.

Adicione estas using diretivas na parte superior do arquivo:

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

Adicione as linhas a seguir antes da chamada app.MapGet, atualizando <vault-name> para o nome do seu cofre de chaves. Esse código usa DefaultAzureCredential para autenticar para Key Vault por meio da identidade gerenciada do aplicativo Web. Para obter mais informações, consulte o guia do desenvolvedor. O código também configura a retirada exponencial para repetições, caso o Key Vault seja limitado. Para obter detalhes sobre limites de transação, confira Orientação sobre limites do Azure Key Vault.

SecretClientOptions options = new SecretClientOptions()
    {
        Retry =
        {
            Delay= TimeSpan.FromSeconds(2),
            MaxDelay = TimeSpan.FromSeconds(16),
            MaxRetries = 5,
            Mode = RetryMode.Exponential
         }
    };
var client = new SecretClient(new Uri("https://<vault-name>.vault.azure.net/"), new DefaultAzureCredential(), options);

KeyVaultSecret secret = client.GetSecret("<secret-name>");

string secretValue = secret.Value;

Atualize a linha app.MapGet("/", () => "Olá, Mundo!"); para:

app.MapGet("/", () => secretValue);

Salve as alterações.

Reimplantar seu aplicativo Web

Reconstrua o pacote de implantação e implante-o novamente:

dotnet publish -c Release -o ./publish
cd publish
zip -r ../akvwebapp.zip .
cd ..
az webapp deploy --resource-group "<resource-group>" --name "<webapp-name>" --src-path ./akvwebapp.zip --type zip

Acesse o seu aplicativo Web concluído

https://<webapp-name>.azurewebsites.net

Onde você viu anteriormente "Olá, Mundo!", agora você vê o valor do seu segredo.

Próximas etapas