Autenticar aplicativos .NET para serviços do Azure durante o desenvolvimento local usando entidades de serviço
Artigo
Os desenvolvedores precisam depurar e testar aplicativos de nuvem nas suas estações de trabalho locais. Ainda que o aplicativo seja executado na estação de trabalho de um desenvolvedor durante o desenvolvimento local, é necessário se autenticar em todos os serviços do Azure usados pelo aplicativo. Este artigo aborda como configurar objetos de entidade de serviço de aplicativo dedicados a serem usados durante o desenvolvimento local.
As entidades de serviço de aplicativo dedicadas para desenvolvimento local permitem que você siga o princípio do privilégio mínimo durante o desenvolvimento de aplicativos. Como as permissões são restritas ao que é necessário para o aplicativo durante o desenvolvimento, o código do aplicativo é impedido de acessar acidentalmente um recurso do Azure destinado a ser usado por outro aplicativo. Isso também impede que bugs causados por privilégios excessivos no ambiente de desenvolvimento ocorram quando o aplicativo é movido para produção.
Uma entidade de serviço de aplicativo é configurada para o aplicativo quando o aplicativo é registrado no Azure. Ao registrar um aplicativo para desenvolvimento local, é recomendável:
Criar um registro de aplicativo separado para cada desenvolvedor que trabalha no aplicativo. Isso criará entidades de serviço de aplicativo separadas para cada desenvolvedor usar durante o desenvolvimento local e evitará a necessidade de os desenvolvedores compartilharem credenciais para uma única entidade de serviço de aplicativo.
Criar um registro de aplicativo separado por aplicativo. Isso define o escopo das permissões do aplicativo apenas para o que é necessário para o aplicativo.
Durante o desenvolvimento local, as variáveis de ambiente são definidas com a identidade da entidade de serviço de aplicativo. A biblioteca de Identidade do Azure lê essas variáveis de ambiente e usa essas informações para autenticar o aplicativo nos recursos do Azure necessários.
1 – Registrar o aplicativo no Azure
Os objetos da entidade de serviço de aplicativo são criados com um registro de aplicativo no Azure. Isso pode ser feito usando o portal do Azure ou a CLI do Azure.
Insira registros de aplicativos na caixa de pesquisa na parte superior do portal do Azure.
Selecione o item rotulado Registros de aplicativo sob o título Serviços no menu que aparece abaixo da barra de pesquisa.
Na páginaRegistros de aplicativo, selecione + Novo registro.
Na página Registrar um aplicativo, preencha o formulário conforme segue.
Nome → Insira um nome para o registro de aplicativo no Azure. É recomendável que esse nome inclua o nome do aplicativo, o usuário para quem se destina o registro do aplicativo e um identificador como "dev" para indicar que esse registro de aplicativo é para uso no desenvolvimento local.
Tipos de conta compatíveis → Contas somente neste diretório organizacional.
Selecione Registrar para registrar seu aplicativo e criar a entidade de serviço de aplicativo.
Na página Registro de aplicativo do seu aplicativo:
ID do aplicativo (cliente) → Essa é a ID de 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 de diretório (locatário) → Esse valor também será necessário para seu aplicativo quando ele for autenticado no Azure. Copie esse valor para um local temporário em um editor de texto, pois 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 e segredos, selecione + Novo segredo do cliente.
A caixa de diálogo Adicionar um segredo de cliente será exibida do lado direito da página. Nesta caixa de diálogo:
Descrição → Inserir um valor de Atual.
Expira → Selecione um valor de 24 meses.
Selecione Adicionar para adicionar o segredo.
Na página Certificados e 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 do cliente extra sem invalidar esse segredo do cliente, mas não verá esse valor novamente.
Primeiro, use o comando az ad sp create-for-rbac para criar uma nova entidade de serviço para o aplicativo. Isso também criará o registro de aplicativo para o aplicativo ao mesmo tempo.
az ad sp create-for-rbac \
--name {service-principal-name}
A saída desse comando é semelhante ao seguinte JSON:
Copie essa saída em um arquivo temporário em um editor de texto, pois você precisará desses valores em uma etapa futura. Esse é o único lugar em que você vê o segredo do cliente (a senha) da entidade de serviço. No entanto, você pode adicionar uma nova senha posteriormente sem invalidar a entidade de serviço ou as senhas existentes, se necessário.
2 – Criar um grupo do Microsoft Entra para desenvolvimento local
Como normalmente há vários desenvolvedores que trabalham em um aplicativo, é recomendável criar um grupo do Microsoft Entra para encapsular as funções (permissões) de que o aplicativo precisa no desenvolvimento local em vez de atribuir as funções a objetos de entidade de serviço individuais. Essa abordagem oferece as seguintes vantagens:
Cada desenvolvedor deve ter as mesmas funções atribuídas, já que as funções são atribuídas no nível do grupo.
Se for necessária uma nova função para o aplicativo, ela só precisará ser adicionada ao grupo do aplicativo.
Se um novo desenvolvedor ingressar na equipe, uma nova entidade de serviço de aplicativo será criada para o desenvolvedor e adicionada ao grupo, garantindo que o desenvolvedor tenha as permissões certas para trabalhar no aplicativo.
Navegue até a página do Microsoft Entra ID no portal do Azure digitando Microsoft Entra ID na caixa de pesquisa na parte superior da página. Selecione Microsoft Entra ID na seção Serviços.
Na página Microsoft Entra ID, selecione Grupos no menu à esquerda.
Na página Todos os grupos, selecione Novo grupo.
Na página Novo grupo:
Tipo de grupo → Segurança
Nome do grupo → Um nome para o grupo de segurança, normalmente criado com base no nome do aplicativo. Também é útil incluir uma cadeia de caracteres como desenvolvimento local no nome do grupo para indicar a finalidade do grupo.
Descrição do grupo → Uma descrição da finalidade do grupo.
Selecione o link Nenhum membro selecionado em Membros para adicionar membros ao grupo.
Na caixa de diálogo Adicionar membros:
Use a caixa de pesquisa para filtrar a lista de nomes de entidade de segurança na lista.
Selecione as entidades de serviço de aplicativo para desenvolvimento local para este aplicativo. Conforme os objetos são selecionados, eles ficarão esmaecidos e serão movidos para a lista Itens selecionados na parte inferior da caixa de diálogo.
Depois de concluir, escolha o botão Selecionar.
De volta à página Novo grupo, selecione Criar para criar o grupo.
O grupo será criado e você retornará para a página Todos os grupos. Pode levar até 30 segundos para que o grupo apareça. Talvez seja necessário atualizar a página devido ao cache no portal do Azure.
O comando az ad group create é usado para criar grupos no Microsoft Entra ID. Os parâmetros --display-name e --mail-nickname são obrigatórios. O nome fornecido ao grupo deve ter como base o nome do aplicativo. Também é útil incluir uma frase como "desenvolvimento local" no nome do grupo para indicar a finalidade do grupo.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description {group-description}
Para adicionar membros ao grupo, você precisará da ID do objeto da entidade de serviço do aplicativo, que é diferente da ID do aplicativo. Use o comando az ad sp list para listar as entidades de serviço disponíveis. O comando de parâmetro --filter aceita filtros de estilo OData e pode ser usado para filtrar a lista, conforme mostrado. O parâmetro --query limita as colunas somente às de interesse.
az ad sp list \
--filter "startswith(displayName, 'msdocs')" \
--query "[].{objectId:objectId, displayName:displayName}" \
--output table
az ad group member add \
--group {group-name} \
--member-id {object-id}
3 – Atribuir funções ao aplicativo
Agora, determine quais funções (permissões) seu aplicativo precisa em quais recursos e atribua essas funções ao aplicativo. Nesse exemplo, as funções são atribuídas ao grupo do Microsoft Entra criado na etapa 2. Os grupos podem receber uma função em um recurso, um grupo de recursos ou um escopo de assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, pois a maioria dos aplicativos agrupa todos os recursos do Azure em um único grupo de recursos.
Localize o grupo de recursos no 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 no 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 a guia Atribuições de função.
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 ao grupo de recursos.
Use a caixa de pesquisa para filtrar a lista para obter um tamanho mais gerenciável. Este exemplo mostra como filtrar as funções do Blob de Armazenamento.
Selecione a função que você deseja 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 emAtribuir acesso a.
Selecione + Selecionar membros em Membros.
Uma caixa de diálogo é 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 do grupo de desenvolvimento local do Microsoft Entra que você criou para o aplicativo.
Selecione o grupo de desenvolvimento local do Microsoft Entra associado ao seu aplicativo.
Para continuar, selecione Selecionar na parte inferior da caixa de diálogo.
O grupo Microsoft Entra é exibido como selecionado na tela Adicionar atribuição de função. Selecione Revisar + atribuir para ir para a página final e, em seguida, Revisar + atribuir novamente para concluir o processo.
Uma entidade de serviço do aplicativo recebe uma função no Azure usando o comando az role assignment create:
az role assignment create --assignee "{appId}" \
--role "{roleName}" \
--resource-group "{resourceGroupName}"
Para obter os nomes da função aos quais uma entidade de serviço pode ser atribuída, use o comando az role definition list:
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Por exemplo, para permitir que a entidade de serviço do aplicativo com appId igual a 00000000-0000-0000-0000-000000000000 tenha acesso de leitura, gravação e exclusão nos contêineres e dados do blob de Armazenamento do Microsoft Azure em todas as contas de armazenamento no grupo de recursos msdocs-dotnet-sdk-auth-example, atribua a entidade de serviço do aplicativo à função 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"
Em runtime, DefaultAzureCredential procura as informações da entidade de serviço em uma coleção de variáveis de ambiente. Há várias maneiras de configurar variáveis de ambiente ao trabalhar com o .NET, dependendo de suas ferramentas e do ambiente.
Qualquer que seja a abordagem escolhida, você deve 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 da ID do locatário.
AZURE_CLIENT_SECRET → A senha/credencial gerada para o aplicativo.
Ao trabalhar localmente com o Visual Studio, as variáveis de ambiente podem ser definidas no arquivo launchsettings.json na pasta Properties do projeto. Quando o aplicativo é iniciado, esses valores são obtidos automaticamente. Tenha em mente que essas configurações não seguem com seu aplicativo quando ele é implantado, portanto, você ainda precisará configurar variáveis de ambiente no ambiente de hospedagem de destino.
Ao trabalhar localmente com o Visual Studio Code, as variáveis de ambiente podem ser definidas no arquivo launch.json do projeto. Quando o aplicativo for iniciado, esses valores serão obtidos automaticamente. Tenha em mente que essas configurações não seguem com seu aplicativo quando ele é implantado, portanto, você ainda precisará configurar variáveis de ambiente no ambiente de hospedagem de destino.
Você pode definir variáveis de ambiente para Windows na linha de comando. No entanto, quando se usa essa abordagem, os valores ficam acessíveis a todos os aplicativos em execução nesse sistema operacional e poderão causar conflitos se você não tomar 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
O PowerShell também pode ser usado para definir variáveis de ambiente no nível do usuário ou do computador:
# 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")
5 – Implementar DefaultAzureCredential no seu aplicativo
DefaultAzureCredential é uma sequência fundamentada e ordenada de mecanismos para autenticação no Microsoft Entra. Cada mecanismo de autenticação é uma classe derivada da classe TokenCredential e é conhecida como credencial. No runtime, a DefaultAzureCredential tenta autenticar usando a primeira credencial. Se essa credencial não conseguir adquirir um token de acesso, a próxima credencial na sequência será tentada e assim por diante, até que um token de acesso seja obtido com êxito. Dessa forma, seu aplicativo pode usar credenciais diferentes em ambientes diferentes sem escrever código específico para cada ambiente.
A ordem e os locais em que DefaultAzureCredential procura credenciais são encontrados em DefaultAzureCredential.
Clique com o botão direito do mouse no seu projeto na janela Gerenciador de Soluções do Visual Studio e selecione Gerenciar Pacotes NuGet. Pesquise Azure.Identity e instale o pacote correspondente. Repita esse processo no pacote Microsoft.Extensions.Azure.
Os serviços do Azure são acessados usando classes de cliente especializadas das várias bibliotecas de clientes do SDK do Azure. Essas classes e seus próprios serviços personalizados devem ser registrados para que possam ser acessados pela injeção de dependência no aplicativo. Em Program.cs, siga as seguintes etapas para registrar uma classe cliente e DefaultAzureCredential:
Inclua os namespaces Azure.Identity e Microsoft.Extensions.Azure por meio das diretivas using.
Registre o cliente de serviço do Azure usando o método de extensão com prefixo Addcorrespondente.
Passe uma instância do DefaultAzureCredential para o método UseCredential.
Por exemplo:
using Microsoft.Extensions.Azure;
using Azure.Identity;
builder.Services.AddAzureClients(clientBuilder =>
{
clientBuilder.AddBlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"));
clientBuilder.UseCredential(new DefaultAzureCredential());
});
Uma alternativa para UseCredential é criar uma instância de DefaultAzureCredential diretamente:
using Azure.Identity;
builder.Services.AddSingleton<BlobServiceClient>(_ =>
new BlobServiceClient(
new Uri("https://<account-name>.blob.core.windows.net"),
new DefaultAzureCredential()));
Quando o código anterior é executado na sua estação de trabalho de desenvolvimento local, ele procura uma entidade de serviço de aplicativo nas variáveis de ambiente ou procura um conjunto de credenciais de desenvolvedor nas ferramentas de desenvolvedor instaladas localmente, como o Visual Studio. Qualquer abordagem 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-se em outros serviços automaticamente.
Colaborar conosco no GitHub
A fonte deste conteúdo pode ser encontrada no GitHub, onde você também pode criar e revisar problemas e solicitações de pull. Para obter mais informações, confira o nosso guia para colaboradores.