Autenticar recursos do Azure a partir de aplicativos .NET hospedados no local
Artigo
Os aplicativos hospedados fora do Azure (por exemplo, no local ou em um data center de terceiros) devem usar uma entidade de serviço de aplicativo para autenticar no Azure ao acessar recursos do Azure. Os objetos principais do serviço de aplicativo são criados usando o processo de registro do aplicativo no Azure. Quando uma entidade de serviço de aplicativo é criada, uma ID do cliente e um segredo do cliente serão gerados para seu aplicativo. A ID do cliente, o segredo do cliente e a ID do locatário são armazenados em variáveis de ambiente para que possam ser usados pelo SDK do Azure para .NET para autenticar seu aplicativo no Azure em tempo de execução.
Um registro de aplicativo diferente deve ser criado para cada ambiente em que o aplicativo está hospedado. Isso permite que permissões de recursos específicos do ambiente sejam configuradas para cada entidade de serviço e certifique-se de que um aplicativo implantado em um ambiente não converse com os recursos do Azure que fazem parte de outro ambiente.
1 - Registar a aplicação no Azure
Um aplicativo pode ser registrado no Azure usando o portal do Azure ou a CLI do Azure.
Insira registros de aplicativos na barra de pesquisa na parte superior do portal do Azure.
Selecione o item rotulado Registros de aplicativos sob o título Serviços no menu que aparece abaixo da barra de pesquisa.
Na página Registos da aplicação, selecione + Novo registo.
Na página Registar uma candidatura, preencha o formulário da seguinte forma.
Nome → Insira um nome para o registro do aplicativo no Azure. Recomenda-se que esse nome inclua o nome do aplicativo e o ambiente (teste, prod) para o qual o registro do aplicativo se destina.
Tipos de conta suportados → Contas somente neste diretório organizacional.
Selecione Registrar para registrar seu aplicativo e criar a entidade de serviço do aplicativo.
Na página Registo da aplicação para a sua aplicação:
ID do aplicativo (cliente) → Esta é a ID do aplicativo que o aplicativo usará para acessar o Azure durante o desenvolvimento local. Copie esse valor para um local temporário em um editor de texto, pois você precisará dele em uma etapa futura.
ID do diretório (locatário) → Esse valor também será necessário para seu aplicativo quando ele se autenticar no Azure. Copie esse valor para um local temporário em um editor de texto, ele também será necessário em uma etapa futura.
Credenciais do cliente → Você deve definir as credenciais do cliente para o aplicativo antes que seu aplicativo possa se autenticar no Azure e usar os serviços do Azure. Selecione Adicionar um certificado ou segredo para adicionar credenciais ao seu aplicativo.
Na página Certificados & segredos, selecione + Novo segredo do cliente.
A caixa de diálogo Adicionar um segredo do cliente aparecerá no lado direito da página. Nesta caixa de diálogo:
Descrição → Insira um valor de Atual.
Expira → Selecione um valor de 24 meses.
Selecione Adicionar para adicionar o segredo.
IMPORTANTE: Defina um lembrete no seu calendário antes da data de expiração do segredo. Dessa forma, você pode adicionar um novo segredo antes e atualizar seus aplicativos antes da expiração desse segredo e evitar uma interrupção do serviço em seu aplicativo.
Na página Certificados & segredos, será mostrado o valor do segredo do cliente.
Copie esse valor para um local temporário em um editor de texto, pois você precisará dele em uma etapa futura.
IMPORTANTE: Esta é a única vez que você verá esse valor. Depois de sair ou atualizar esta página, você não poderá ver esse valor novamente. Você pode adicionar um segredo de cliente adicional sem invalidar esse segredo de cliente, mas não verá esse valor novamente.
az ad sp create-for-rbac --name <app-name>
A saída do comando será semelhante à seguinte. Anote esses valores ou mantenha esta janela aberta, pois você precisará desses valores na próxima etapa e não poderá visualizar o valor da senha (segredo do cliente) novamente.
2 - Atribuir funções à entidade de serviço do aplicativo
Em seguida, você precisa determinar quais funções (permissões) seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. As funções podem ser atribuídas a uma função em um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostrará como atribuir funções para a entidade de serviço 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.
Localize o grupo de recursos para seu aplicativo pesquisando o nome do grupo de recursos usando a caixa de pesquisa na parte superior do portal do Azure.
Navegue até o grupo de recursos selecionando o nome do grupo de recursos sob o título Grupos de Recursos na caixa de diálogo.
Na página do grupo de recursos, selecione Controle de acesso (IAM) no menu à esquerda.
Na página Controle de acesso (IAM):
Selecione o separador Atribuição de funções.
Selecione + Adicionar no menu superior e, em seguida, Adicionar atribuição de função no menu suspenso resultante.
A página Adicionar atribuição de função lista todas as funções que podem ser atribuídas para o grupo de recursos.
Use a caixa de pesquisa para filtrar a lista para um tamanho mais gerenciável. Este exemplo mostra como filtrar funções de Blob de Armazenamento.
Selecione a função que pretende atribuir.
Selecione Avançar para ir para a próxima tela.
A próxima página Adicionar atribuição de função permite especificar a qual usuário atribuir a função.
Selecione Usuário, grupo ou entidade de serviço em Atribuir acesso a.
Selecione + Selecionar membros em Membros
Uma caixa de diálogo será aberta no lado direito do portal do Azure.
Na caixa de diálogo Selecionar membros:
A caixa de texto Selecionar pode ser usada para filtrar a lista de usuários e grupos em sua assinatura. Se necessário, digite os primeiros caracteres da entidade de serviço que você criou para o aplicativo filtrar a lista.
Selecione a entidade de serviço associada ao seu aplicativo.
Selecione Selecionar na parte inferior da caixa de diálogo para continuar.
A entidade de serviço agora será exibida como selecionada na tela Adicionar atribuição de função.
Selecione Rever + atribuir para ir para a página final e, em seguida, Rever + atribuir novamente para concluir o processo.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por exemplo, para permitir que a entidade de serviço com o appId de leitura, gravação e exclusão acesse contêineres e dados de blob de Armazenamento do Azure a todas as contas de armazenamento no grupo de recursos msdocs-dotnet-sdk-auth-example, você atribuiria a entidade de 00000000-0000-0000-0000-000000000000 serviço do aplicativo à função de Colaborador de Dados de Blob de Armazenamento usando o comando a seguir.
az role assignment create --assignee "00000000-0000-0000-0000-000000000000" \
--role "Storage Blob Data Contributor" \
--resource-group "msdocs-dotnet-sdk-auth-example"
Para obter informações sobre como atribuir permissões no nível de recurso ou assinatura usando a CLI do Azure, consulte o artigo Atribuir funções do Azure usando a CLI do Azure.
3 - Configurar variáveis de ambiente para aplicação
O DefaultAzureCredential objeto procurará credenciais da entidade de serviço em um conjunto de variáveis de ambiente em tempo de execução. Há várias maneiras de configurar variáveis de ambiente ao trabalhar com o .NET, dependendo de suas ferramentas e ambiente.
Independentemente da abordagem escolhida, você precisará configurar as seguintes variáveis de ambiente ao trabalhar com uma entidade de serviço.
AZURE_CLIENT_ID → O valor da ID do aplicativo.
AZURE_TENANT_ID → O valor de ID do locatário.
AZURE_CLIENT_SECRET → A senha/credencial gerada para o aplicativo.
Se seu aplicativo estiver hospedado no IIS, é recomendável definir variáveis de ambiente por pool de aplicativos para isolar as configurações entre aplicativos.
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='ASPNETCORE_ENVIRONMENT',value='Production']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_ID',value='00000000-0000-0000-0000-000000000000']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_TENANT_ID',value='11111111-1111-1111-1111-111111111111']" /commit:apphost
appcmd.exe set config -section:system.applicationHost/applicationPools /+"[name='Contoso'].environmentVariables.[name='AZURE_CLIENT_SECRET',value='=abcdefghijklmnopqrstuvwxyz']" /commit:apphost
Você também pode definir essas configurações diretamente usando o applicationPools elemento dentro do applicationHost.config arquivo.
Você pode definir variáveis de ambiente para o Windows a partir da linha de comando. No entanto, ao usar essa abordagem, os valores são acessíveis a todos os aplicativos em execução nesse sistema operacional e podem causar conflitos se você não tiver cuidado. As variáveis de ambiente podem ser definidas no nível do usuário ou do sistema.
# Set user environment variables
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000"
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111"
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz"
# Set system environment variables - requires running as admin
setx ASPNETCORE_ENVIRONMENT "Development"
setx AZURE_CLIENT_ID "00000000-0000-0000-0000-000000000000" /m
setx AZURE_TENANT_ID "11111111-1111-1111-1111-111111111111" /m
setx AZURE_CLIENT_SECRET "=abcdefghijklmnopqrstuvwxyz" /m
Você também pode usar o PowerShell para definir variáveis de ambiente no nível do usuário ou da máquina.
# Set user environment variables
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "User")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "User")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "User")
# Set system environment variables - requires running as admin
[Environment]::SetEnvironmentVariable("ASPNETCORE_ENVIRONMENT", "Development", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_ID", "00000000-0000-0000-0000-000000000000", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_TENANT_ID", "11111111-1111-1111-1111-111111111111", "Machine")
[Environment]::SetEnvironmentVariable("AZURE_CLIENT_SECRET", "=abcdefghijklmnopqrstuvwxyz", "Machine")
4 - Implementar DefaultAzureCredential no aplicativo
DefaultAzureCredential Suporta vários métodos de autenticação e determina o método de autenticação que está sendo usado em tempo de execução. Dessa forma, seu aplicativo pode usar diferentes métodos de autenticação em ambientes diferentes sem implementar código específico do ambiente.
A ordem e os locais em que DefaultAzureCredential procura credenciais são encontrados em DefaultAzureCredential.
Para implementar DefaultAzureCredentialo , primeiro adicione os Azure.Identity pacotes e, opcionalmente, ao Microsoft.Extensions.Azure seu aplicativo. Você pode fazer isso usando a linha de comando ou o Gerenciador de Pacotes NuGet.
Clique com o botão direito do mouse no nó do projeto no Visual Studio e selecione Gerenciar pacotes NuGet. Procure Azure.Identity no campo de pesquisa e instale o pacote correspondente. Repita esse processo para o pacote Microsoft.Extensions.Azure também.
Os serviços do Azure geralmente são acessados usando as classes de cliente correspondentes do SDK. Essas classes e seus próprios serviços personalizados devem ser registrados no arquivo para que possam ser acessados por injeção de dependência em todo o Program.cs aplicativo. Dentro do Program.cs, siga as etapas abaixo para configurar corretamente seu serviço e DefaultAzureCredential.
Inclua os Azure.Identity namespaces e Microsoft.Extensions.Azure com uma instrução using.
Registre o serviço do Azure usando métodos auxiliares relevantes.
Passe uma instância do DefaultAzureCredential objeto para o UseCredential método.
Um exemplo disso é mostrado no segmento de código a seguir.
using Microsoft.Extensions.Azure;
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddAzureClients(x =>
{
x.AddBlobServiceClient(new Uri("https://<account-name>.blob.core.windows.net"));
x.UseCredential(new DefaultAzureCredential());
});
Como alternativa, você também pode utilizar DefaultAzureCredential em seus serviços mais diretamente sem a ajuda de métodos de registro adicionais do Azure, conforme visto abaixo.
using Azure.Identity;
// Inside of Program.cs
builder.Services.AddSingleton<BlobServiceClient>(x =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
Quando o código acima é executado em sua estação de trabalho local durante o desenvolvimento local, ele procurará nas variáveis de ambiente uma entidade de serviço de aplicativo ou no Visual Studio, VS Code, CLI do Azure ou Azure PowerShell para um conjunto de credenciais de desenvolvedor, qualquer uma das quais pode ser usada para autenticar o aplicativo nos recursos do Azure durante o desenvolvimento local.
Quando implantado no Azure, esse mesmo código também pode autenticar seu aplicativo em outros recursos do Azure. DefaultAzureCredential Pode recuperar configurações de ambiente e configurações de identidade gerenciada para autenticar em outros serviços automaticamente.
Colabore connosco no GitHub
A origem deste conteúdo pode ser encontrada no GitHub, onde também pode criar e rever problemas e pedidos Pull. Para mais informações, consulte o nosso guia do contribuidor.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja: https://aka.ms/ContentUserFeedback.