Tutorial: Use uma identidade gerida para ligar o Key Vault a uma aplicação web do Azure em .NET

Azure Key Vault fornece uma forma de armazenar credenciais e outros segredos com maior segurança. Mas o seu código precisa de autenticar no Key Vault para os recuperar. As identidades geridas para recursos do Azure resolvem este problema ao dar aos serviços do Azure uma identidade gerida automaticamente no Microsoft Entra ID. O seu código usa esta identidade para autenticar em qualquer serviço que suporte autenticação Microsoft Entra, incluindo o Key Vault, sem incorporar credenciais no código.

Neste tutorial, cria e implementa uma aplicação web do Azure para o Serviço de Aplicações do Azure, depois usa uma identidade gerida para autenticar a aplicação num cofre de chaves, utilizando a biblioteca cliente secreta do Azure Key Vault para .NET e o CLI do Azure. Os mesmos princípios aplicam-se se usar outra linguagem, Azure PowerShell ou o portal Azure.

Para mais informações sobre aplicações web e implementação de Serviços de Aplicações, consulte:

Pré-requisitos

Para concluir este tutorial, você precisa:

Se já tem uma aplicação web implementada no Serviço de Aplicações do Azure, salte para Configurar a aplicação web para se ligar ao Key Vault e Modificar a aplicação para aceder ao seu Key Vault.

Crie uma aplicação .NET Core

Neste passo, configure o projeto local .NET.

Numa janela de terminal, crie um diretório com nome akvwebapp e mude para ele:

mkdir akvwebapp
cd akvwebapp

Crie uma aplicação web .NET usando o novo comando web dotnet:

dotnet new web

Executa a aplicação localmente para veres como fica antes de a implementares no Azure:

dotnet run

Num navegador web, abra a aplicação em http://localhost:5000. Vês a mensagem "Hello World!" da aplicação de exemplo.

Para mais informações sobre a criação de aplicações web, consulte Criar uma aplicação web ASP.NET Core no Serviço de Aplicações do Azure.

Implementar a aplicação no Azure

Neste passo, implemente a aplicação .NET para o Serviço de Aplicações do Azure usando zip deploy. O Zip Deploy é o mecanismo recomendado de implementação baseada em pacotes para App Service. Para entrega contínua a partir do controlo de versão, use GitHub Actions ou Azure DevOps Pipelines em vez disso.

Criar um grupo de recursos

Crie um grupo de recursos para conter o cofre de chaves e a aplicação web usando o 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 Aplicações ao utilizar az appservice plan create. O exemplo seguinte cria um plano nomeado myAppServicePlan no nível livre (FREE):

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

Criar um aplicativo Web

Crie uma aplicação web do Azure no myAppServicePlan plano.

Importante

Tal como um cofre de chaves, uma aplicação web do Azure deve ter um nome globalmente único. Substitua <webapp-name> pelo nome da sua aplicação web.

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

Vá à nova aplicação para confirmar que está a funcionar:

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

Vê a página padrão de uma nova aplicação web do Azure.

Implemente a sua aplicação local com o zip deploy

A partir do akvwebapp diretório do projeto, constrói o projeto e cria um deployment zip:

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

Sugestão

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

Implemente o ficheiro ZIP na sua aplicação web com az webapp deploy:

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

Atualize a aplicação implementada no seu navegador web:

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

Vês a mesma mensagem "Hello World!" que viste em http://localhost:5000.

Configure a aplicação web para se ligar ao Key Vault

Nesta secção, pode ativar a aplicação web para aceder ao Key Vault e atualizar o código da sua aplicação para recuperar um segredo.

Criar e atribuir acesso a uma identidade gerenciada

Use uma identidade gerida para autenticar a aplicação web no Key Vault. Uma identidade gerida elimina a necessidade de gerir credenciais em código.

Crie a identidade para a aplicação com az webapp identity assign:

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

O comando devolve um excerto JSON semelhante a este:

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

Para obter permissões para o seu cofre de chaves através de Role-Based Controlo de Acesso (RBAC), atribua uma função ao seu "Nome Principal do Utilizador" (UPN) usando o comando 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> pelos seus valores reais. Se usaste um nome diferente de grupo de recursos, substitui também "myResourceGroup". Seu UPN normalmente estará no formato de um endereço de e-mail (por exemplo, username@domain.com).

Modificar o aplicativo para acessar seu cofre de chaves

Este tutorial utiliza a biblioteca secreta do cliente Azure Key Vault. Também pode usar a biblioteca cliente de certificados Azure Key Vault ou a biblioteca cliente de chaves Azure Key Vault.

Instalar os pacotes

A partir da janela do terminal, instale a biblioteca cliente secreta Azure Key Vault e a biblioteca cliente Azure Identity:

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

Atualizar o código

Abra Program.cs no projeto akvwebapp.

Adicione estas using diretivas no topo do ficheiro:

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

Adicione as linhas seguintes antes da chamada app.MapGet, substituindo <vault-name> pelo nome do seu cofre de chaves. Este código utiliza DefaultAzureCredential para se autenticar no Key Vault através da identidade gerida da aplicação Web. Para mais informações, consulte o guia do programador. O código também configura o backoff exponencial para retentativas caso o Key Vault seja limitado. Para obter detalhes sobre os limites de transação, consulte as orientações sobre limitação 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("/", () => "Hello World!"); para:

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

Guarde as alterações.

Reimplantar seu aplicativo Web

Reconstrua o pacote de implementação e volte a implementar:

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

Aceda à aplicação Web concluída

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

Onde antes vias "Hello World!", agora vês o valor do teu segredo.

Próximos passos