Tutorial: Usar uma identidade gerenciada para conectar o Cofre da Chave a um aplicativo Web do Azure no .NET

O Azure Key Vault fornece uma maneira de armazenar credenciais e outros segredos com maior segurança. Mas seu código precisa ser autenticado no Cofre da Chave para recuperá-los. As identidades gerenciadas para recursos do Azure ajudam a resolver esse problema fornecendo aos serviços do Azure uma identidade gerenciada automaticamente na ID do Microsoft Entra. Pode utilizar esta identidade para se autenticar em qualquer serviço que suporte a autenticação do Microsoft Entra, incluindo o Cofre da Chave, sem ter de apresentar credenciais no seu código.

Neste tutorial, você criará e implantará o aplicativo Web do Azure no Serviço de Aplicativo do Azure. Você usará uma identidade gerenciada para autenticar seu aplicativo Web do Azure com um cofre de chaves do Azure usando a biblioteca de cliente secreta do Cofre da Chave do Azure para .NET e a CLI do Azure. Os mesmos princípios básicos se aplicam quando você usa a linguagem de desenvolvimento de sua escolha, o Azure PowerShell e/ou o portal do Azure.

Para obter mais informações sobre os aplicativos Web e a implantação do Serviço de Aplicativo do Azure apresentados neste tutorial, consulte:

Pré-requisitos

Para concluir este tutorial, precisa de:

Se você já tiver seu aplicativo Web implantado no Serviço de Aplicativo do Azure, poderá pular para configurar o acesso do aplicativo Web a um cofre de chaves e modificar as seções de código do aplicativo Web.

Criar uma aplicação .NET Core

Nesta etapa, você configurará o projeto .NET Core local.

Em uma janela de terminal em sua máquina, crie um diretório chamado akvwebapp e torne-o o diretório atual:

mkdir akvwebapp
cd akvwebapp

Crie um aplicativo .NET Core usando o comando dotnet new web :

dotnet new web

Execute o aplicativo localmente para saber como ele deve ficar ao implantá-lo no Azure:

dotnet run

Em um navegador da Web, vá para o aplicativo em http://localhost:5000.

Você verá a mensagem "Hello World!" do aplicativo de exemplo exibido na página.

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

Implementar a aplicação no Azure

Nesta etapa, você implantará seu aplicativo .NET Core no Serviço de Aplicativo do Azure usando o Git local. Para obter mais informações sobre como criar e implantar aplicativos, consulte Criar um aplicativo Web ASP.NET Core no Azure.

Configurar a implantação local do Git

Na janela do terminal, selecione Ctrl+C para fechar o servidor Web. Inicialize um repositório Git para o projeto .NET Core:

git init --initial-branch=main
git add .
git commit -m "first commit"

Você pode usar FTP e Git local para implantar um aplicativo Web do Azure usando um usuário de implantação. Depois de configurar seu usuário de implantação, você pode usá-lo para todas as suas implantações do Azure. Seu nome de usuário e senha de implantação no nível de conta são diferentes de suas credenciais de assinatura do Azure.

Para configurar o usuário de implantação, execute o comando az webapp deployment user set . Escolha um nome de usuário e senha que siga estas diretrizes:

  • O nome do utilizador tem de ser exclusivo no Azure. Para pushes locais do Git, ele não pode conter o símbolo do sinal de arroba (@).
  • A senha deve ter pelo menos oito caracteres e conter dois dos três elementos a seguir: letras, números e símbolos.
az webapp deployment user set --user-name "<username>" --password "<password>"

A saída JSON mostra a senha como null. Se você receber um 'Conflict'. Details: 409 erro, altere o nome de usuário. Se obtiver o 'Bad Request'. Details: 400 erro, utilize uma palavra-passe mais forte.

Registre seu nome de usuário e senha para que você possa usá-lo para implantar seus aplicativos Web.

Criar um grupo de recursos

Um grupo de recursos é um contêiner lógico no qual você implanta recursos do Azure e os gerencia. Crie um grupo de recursos para conter seu cofre de chaves e seu aplicativo Web usando o comando az group create :

az group create --name "myResourceGroup" -l "EastUS"

Criar um plano do Serviço de Aplicações

Crie um plano do Serviço de Aplicativo usando o comando Azure CLI az appservice plan create . Este exemplo a seguir cria um plano do Serviço de Aplicativo nomeado myAppServicePlan na camada de FREE preço:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE

Quando o plano do Serviço de Aplicativo é criado, a CLI do Azure exibe informações semelhantes às que você vê aqui:

{ 
  "adminSiteName": null,
  "appServicePlanName": "myAppServicePlan",
  "geoRegion": "West Europe",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "app",
  "location": "West Europe",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

Para obter mais informações, veja Gerir um plano do Serviço de Aplicações no Azure.

Criar uma aplicação Web

Crie um aplicativo Web do myAppServicePlan Azure no plano do Serviço de Aplicativo.

Importante

Como um cofre de chaves, um aplicativo Web do Azure deve ter um nome exclusivo. Substitua <your-webapp-name> pelo nome do seu aplicativo Web nos exemplos a seguir.

az webapp create --resource-group "myResourceGroup" --plan "myAppServicePlan" --name "<your-webapp-name>" --deployment-local-git

Quando o aplicativo Web é criado, a CLI do Azure mostra uma saída semelhante à que você vê aqui:

Local git is configured with url of 'https://<username>@<your-webapp-name>.scm.azurewebsites.net/<ayour-webapp-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "clientCertExclusionPaths": null,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<your-webapp-name>.azurewebsites.net",
  "deploymentLocalGitUrl": "https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

A URL do controle remoto Git é mostrada deploymentLocalGitUrl na propriedade, no formato https://<username>@<your-webapp-name>.scm.azurewebsites.net/<your-webapp-name>.git. Salve este URL. Precisará dele mais tarde.

Agora configure seu aplicativo Web para implantar a partir da main ramificação:

 az webapp config appsettings set -g MyResourceGroup --name "<your-webapp-name>" --settings deployment_branch=main

Vá para seu novo aplicativo usando o seguinte comando. Substitua <your-webapp-name> pelo nome do aplicativo.

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

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

Implantar seu aplicativo local

Regresse à janela de terminal local e adicione um remoto do Azure ao seu repositório Git local. No comando a seguir, substitua <deploymentLocalGitUrl-from-create-step> pela URL do controle remoto Git que você salvou na seção Criar um aplicativo Web.

git remote add azure <deploymentLocalGitUrl-from-create-step>

Use o comando a seguir para enviar por push para o remoto do Azure para implantar seu aplicativo. Quando o Git Credential Manager solicitar credenciais, use as credenciais criadas na seção Configurar a implantação local do Git.

git push azure main

Esse comando pode levar alguns minutos para ser executado. Enquanto é executado, ele exibe informações semelhantes ao que você vê aqui:

Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 285 bytes | 95.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Deploy Async
remote: Updating branch 'main'.
remote: Updating submodules.
remote: Preparing deployment for commit id 'd6b54472f7'.
remote: Repository path is /home/site/repository
remote: Running oryx build...
remote: Build orchestrated by Microsoft Oryx, https://github.com/Microsoft/Oryx
remote: You can report issues at https://github.com/Microsoft/Oryx/issues
remote:
remote: Oryx Version      : 0.2.20200114.13, Commit: 204922f30f8e8d41f5241b8c218425ef89106d1d, ReleaseTagName: 20200114.13
remote: Build Operation ID: |imoMY2y77/s=.40ca2a87_
remote: Repository Commit : d6b54472f7e8e9fd885ffafaa64522e74cf370e1
.
.
.
remote: Deployment successful.
remote: Deployment Logs : 'https://<your-webapp-name>.scm.azurewebsites.net/newui/jsonviewer?view_url=/api/deployments/d6b54472f7e8e9fd885ffafaa64522e74cf370e1/log'
To https://<your-webapp-name>.scm.azurewebsites.net:443/<your-webapp-name>.git
   d87e6ca..d6b5447  main -> main

Vá para (ou atualize) o aplicativo implantado usando seu navegador da Web:

http://<your-webapp-name>.azurewebsites.net

Você verá a mensagem "Olá Mundo!" que viu anteriormente quando visitou http://localhost:5000o .

Para obter mais informações sobre como implantar o aplicativo Web usando o Git, consulte Implantação local do Git no Serviço de Aplicativo do Azure

Configurar o aplicativo Web para se conectar ao Cofre da Chave

Nesta seção, você configurará o acesso da Web ao Cofre da Chave e atualizará o código do aplicativo para recuperar um segredo do Cofre da Chave.

Criar e atribuir uma identidade gerenciada

Neste tutorial, usaremos a identidade gerenciada para autenticar no Cofre da Chave. A identidade gerenciada gerencia automaticamente as credenciais do aplicativo.

Na CLI do Azure, para criar a identidade para o aplicativo, execute o comando az webapp-identity assign :

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

O comando retornará este trecho JSON:

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

Para dar permissão ao seu aplicativo Web para fazer operações de obtenção e lista em seu cofre de chaves, passe para principalId o comando set-policy da CLI az keyvault do Azure:

az keyvault set-policy --name "<your-keyvault-name>" --object-id "<principalId>" --secret-permissions get list

Você também pode atribuir políticas de acesso usando o portal do Azure ou o PowerShell.

Modificar o aplicativo para acessar seu cofre de chaves

Neste tutorial, você usará a biblioteca de cliente secreta do Azure Key Vault para fins de demonstração. Você também pode usar a biblioteca de cliente de certificado do Azure Key Vault ou a biblioteca de cliente de chaves do Azure Key Vault.

Instalar os pacotes

Na janela do terminal, instale a biblioteca de cliente secreta do Azure Key Vault para pacotes de biblioteca de cliente .NET e Azure Identity:

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

Atualizar o código

Localize e abra o arquivo Startup.cs para .NET 5.0 ou anterior, ou o arquivo Program.cs para .NET 6.0 em seu projeto akvwebapp.

Adicione estas linhas ao cabeçalho:

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

Adicione as seguintes linhas antes da app.UseEndpoints chamada (.NET 5.0 ou anterior) ou app.MapGet chamada (.NET 6.0), atualizando o URI para refletir o vaultUri cofre de chaves. Esse código usa DefaultAzureCredential() para autenticar no Cofre da Chave, que usa um token da identidade gerenciada para autenticar. Para obter mais informações sobre como autenticar no Cofre da Chave, consulte o Guia do desenvolvedor. O código também usa backoff exponencial para novas tentativas caso o Key Vault esteja sendo limitado. Para obter mais informações sobre os limites de transação do Cofre de Chaves, consulte Diretrizes de limitação do Cofre de Chaves do Azure.

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://<your-unique-key-vault-name>.vault.azure.net/"), new DefaultAzureCredential(),options);

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

string secretValue = secret.Value;
.NET 5.0 ou anterior

Atualize a linha await context.Response.WriteAsync("Hello World!"); para ter esta aparência:

await context.Response.WriteAsync(secretValue);
.NET 6.0

Atualize a linha app.MapGet("/", () => "Hello World!"); para ter esta aparência:

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

Certifique-se de salvar suas alterações antes de continuar para a próxima etapa.

Reimplementar a aplicação Web

Agora que você atualizou seu código, pode reimplantá-lo no Azure usando estes comandos do Git:

git add .
git commit -m "Updated web app to access my key vault"
git push azure main

Aceda à aplicação Web concluída

http://<your-webapp-name>.azurewebsites.net

Onde antes você via "Hello World!", agora você deve ver o valor do seu segredo exibido.

Próximos passos