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:
- Descrição geral do Serviço de Aplicações
- Criar um aplicativo Web ASP.NET Core no Serviço de Aplicativo do Azure
- Implantação local do Git no Serviço de Aplicativo do Azure
Pré-requisitos
Para concluir este tutorial, precisa de:
- Uma subscrição do Azure. Crie um gratuitamente.
- O SDK do .NET Core 3.1 (ou posterior).
- Uma instalação Git da versão 2.28.0 ou superior.
- A CLI do Azure ou o Azure PowerShell.
- Azure Key Vault. Você pode criar um cofre de chaves usando o portal do Azure, a CLI do Azure ou o Azure PowerShell.
- Um segredo do Cofre da Chave. Você pode criar um segredo usando o portal do Azure, o PowerShell ou a CLI do Azure.
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:5000
o .
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 acesso a 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 conceder permissões ao seu aplicativo para seu cofre de chaves por meio do RBAC (Controle de Acesso Baseado em Função), atribua uma função usando o comando az role assignment create da CLI do Azure.
az role assignment create --role "Key Vault Secrets User" --assignee "<app-id>" --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group-name>/providers/Microsoft.KeyVault/vaults/<your-unique-keyvault-name>"
Substitua <app-id>
, <subscription-id>
<resource-group-name>
, e <your-unique-keyvault-name>
pelos seus valores reais. <app-id>
é o ID do Aplicativo (cliente) do seu aplicativo registrado no Microsoft Entra.
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 Program.cs arquivo 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 Cofre da Chave 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.