Autenticar aplicativos NET nos serviços do Azure durante o desenvolvimento local usando entidades de serviço

Ao criar aplicativos de nuvem, os desenvolvedores precisam depurar e testar aplicativos em sua estação de trabalho local. Quando um aplicativo é executado na estação de trabalho de um desenvolvedor durante o desenvolvimento local, ele ainda deve 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.

A diagram showing how a .NET app during local development will use the developer's credentials to connect to Azure by obtaining those credentials locally installed development tools.

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 têm o escopo exatamente do 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 um aplicativo diferente. Isso também impede que bugs ocorram quando o aplicativo é movido para produção porque o aplicativo foi superprivilegiado no ambiente de desenvolvimento.

Uma entidade de serviço de aplicativo é configurada para o aplicativo quando o aplicativo é registrado no Azure. Ao registrar aplicativos para desenvolvimento local, é recomendável:

  • Criar registros de aplicativo separados 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.
  • Crie registros de aplicativo separados 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. O SDK do Azure para NET 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.

Entre no portal do Azure e siga estas etapas.

Instruções Captura de tela
No portal do Azure:
  1. Insira registros de aplicativos na caixa de pesquisa na parte superior do portal do Azure.
  2. Selecione o item rotulado Registros de aplicativo sob o título Serviços no menu que aparece abaixo da barra de pesquisa.
A screenshot showing how to use the top search bar in the Azure portal to find and navigate to the App registrations page.
Na páginaRegistros de aplicativo, selecione + Novo registro. A screenshot showing the location of the New registration button in the App registrations page.
Na página Registrar um aplicativo, preencha o formulário conforme segue.
  1. 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 o qual o registro do aplicativo é e um identificador como 'dev' para indicar que esse registro de aplicativo é para uso no desenvolvimento local.
  2. Tipos de conta compatíveisContas somente neste diretório organizacional.
Selecione Registrar para registrar seu aplicativo e criar a entidade de serviço de aplicativo.
A screenshot showing how to fill out the Register an application page by giving the app a name and specifying supported account types as accounts in this organizational directory only.
Na página Registro de aplicativo do seu aplicativo:
  1. 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.
  2. 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 será necessário em uma etapa futura.
  3. 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.
A screenshot of the App registration page after the app registration has been completed. This screenshot shows the location of the application ID and tenant ID, which will be needed in a future step. It also shows the location of the link to use to add an application secret for the app.
Na página Certificados e segredos, selecione + Novo segredo do cliente. A screenshot showing the location of the link to use to create a new client secret on the certificates and secrets page.
A caixa de diálogo Adicionar um segredo de cliente será exibida do lado direito da página. Nesta caixa de diálogo:
  1. Descrição → Inserir um valor de Atual.
  2. Expira → Selecione um valor de 24 meses.
Selecione Adicionar para adicionar o segredo.
A screenshot showing the page where a new client secret is added for the application service principal create by the app registration process.
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.
A screenshot showing the page with the generated client secret.

2 – Criar um grupo de segurança do Azure AD para desenvolvimento local

Como normalmente há vários desenvolvedores que trabalham em um aplicativo, é recomendável criar um grupo de Azure AD 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. As vantagens disso são as seguintes.

  • 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 somente precisa ser adicionada ao grupo do Azure AD para o 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.
Instruções Captura de tela
Navegue até a página do Azure Active Directory no portal do Azure digitando Azure Active Directory na caixa de pesquisa na parte superior da página e selecionando Azure Active Directory em serviços. A screenshot showing how to use the top search bar in the Azure portal to search for and navigate to the Azure Active Directory page.
Na página do Azure Active Directory, selecione Grupos no menu à esquerda. A screenshot showing the location of the Groups menu item in the left-hand menu of the Azure Active Directory Default Directory page.
Na página Todos os grupos, selecione Novo grupo. A screenshot showing the location of the New Group button in the All groups page.
Na página Novo grupo:
  1. Tipo de grupoSegurança
  2. Nome do grupo → Um nome para o grupo de segurança, normalmente criado com base no nome do aplicativo. Também é interessante incluir uma cadeia de caracteres como desenvolvimento local no nome do grupo para indicar a finalidade do grupo.
  3. Descrição do grupo → Uma descrição da finalidade do grupo.
  4. Selecione o link Nenhum membro selecionado em Membros para adicionar membros ao grupo.
A screenshot showing how to fill out the form to create a new Azure Active Directory group for the application. This screenshot also shows the location of the link to select to add members to this group.
Na caixa de diálogo Adicionar membros:
  1. Use a caixa de pesquisa para filtrar a lista de nomes de entidade de segurança na lista.
  2. 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.
  3. Depois de concluir, escolha o botão Selecionar.
A screenshot of the Add members dialog box showing how to select application service principals to be included in the group.
De volta à página Novo grupo, selecione Criar para criar o grupo.

O grupo será criado e você retorna para a página Todos os grupos. Pode levar até 30 segundos para que o grupo apareça e talvez seja necessário atualizar a página devido ao cache no portal do Azure.
A screenshot of the New Group page showing how to complete the process by selecting the Create button.

3 – Atribuir funções ao aplicativo

Em seguida, você precisa determinar as funções (permissões) de que seu aplicativo precisa em quais recursos e atribuir essas funções ao seu aplicativo. Neste exemplo, as funções serão atribuídas ao grupo do Azure Active Directory criado na etapa 2. As funções podem ser atribuídas a uma função em um recurso, grupo de recursos ou escopo de assinatura. Este exemplo mostra como atribuir funções no escopo do grupo de recursos, uma vez que a maioria dos aplicativos agrupa todos os seus recursos do Azure em um único grupo de recursos.

Instruções Captura de tela
Localize o grupo de recursos do aplicativo pesquisando pelo nome do grupo de recursos e 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.
A screenshot showing how to use the top search box in the Azure portal to locate and navigate to the resource group you want to assign roles (permissions) to.
Na página do grupo de recursos, selecione Controle de acesso (IAM) no menu à esquerda. A screenshot of the resource group page showing the location of the Access control (IAM) menu item.
Na página Controle de acesso (IAM):
  1. Selecione a guia Atribuições de função.
  2. Selecione + Adicionar no menu superior e, em seguida, Adicionar atribuição de função no menu suspenso resultante.
A screenshot showing how to navigate to the role assignments tab and the location of the button used to add role assignments to a resource group.
A página Adicionar atribuição de função lista todas as funções que podem ser atribuídas ao grupo de recursos.
  1. 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.
  2. Selecione a função que você deseja atribuir.
Selecione Avançar para ir para a próxima tela.
A screenshot showing how to filter and select role assignments to be added to the resource group.
A próxima página Adicionar atribuição de função permite especificar a qual usuário atribuir a função.
  1. Selecione Usuário, grupo ou entidade de serviço emAtribuir acesso a.
  2. Selecionar + Selecionar membros em Membros
Uma caixa de diálogo será aberta no lado direito do portal do Azure.
A screenshot showing the radio button to select to assign a role to an Azure AD group and the link used to select the group to assign the role to.
Na caixa de diálogo Selecionar membros:
  1. 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 Azure AD criado para o aplicativo.
  2. Selecione o grupo de desenvolvimento local do Azure AD associado ao seu aplicativo.
Para continuar, selecione Selecionar na parte inferior da caixa de diálogo.
A screenshot showing how to filter for and select the Azure AD group for the application in the Select members dialog box.
O grupo do Azure AD agora será 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.
A screenshot showing the completed Add role assignment page and the location of the Review + assign button used to complete the process.

4 – Definir variáveis de ambiente de aplicativo

O objeto DefaultAzureCredential procurará as informações da entidade de serviço em um conjunto de variáveis de ambiente no runtime. 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 variáveis de ambiente a seguir 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 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.

"profiles": {
    "SampleProject": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "applicationUrl": "https://localhost:7177;http://localhost:5177",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID":"11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    },
    "IIS Express": {
      "commandName": "IISExpress",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development",
        "AZURE_CLIENT_ID": "00000000-0000-0000-0000-000000000000",
        "AZURE_TENANT_ID": "11111111-1111-1111-1111-111111111111",
        "AZURE_CLIENT_SECRET": "=abcdefghijklmnopqrstuvwxyz"
      }
    }
  }

5 – Implementar DefaultAzureCredential no seu aplicativo

DefaultAzureCredential dá suporte a vários métodos de autenticação e determina o método de autenticação que está sendo usado em runtime. 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 DefaultAzureCredential, primeiro adicione os pacotes Azure.Identity e, opcionalmente, os pacotes Microsoft.Extensions.Azure ao seu aplicativo. Você pode fazer isso usando a linha de comando ou o Gerenciador de Pacotes NuGet.

Abra um ambiente de terminal de sua escolha no diretório do projeto do aplicativo e insira o comando abaixo.

dotnet add package Azure.Identity
dotnet add package Microsoft.Extensions.Azure

Os serviços do Azure geralmente são acessados usando classes de cliente correspondentes do SDK. Essas classes e seus próprios serviços personalizados devem ser registrados no arquivo Program.cs para que possam ser acessados por meio de injeção de dependência em todo o aplicativo. Dentro de Program.cs, siga as etapas abaixo para configurar corretamente seu serviço e DefaultAzureCredential.

  1. Inclua os namespaces Azure.Identity e Microsoft.Extensions.Azure com uma instrução em uso.
  2. Registre o serviço do Azure usando métodos auxiliares relevantes.
  3. Passe uma instância do objeto DefaultAzureCredential para o método UseCredential.

Um exemplo disso é mostrado na ilustração 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 for executado em sua estação de trabalho local durante o desenvolvimento local, ele procurará nas variáveis de ambiente de uma entidade de serviço de aplicativo ou no Visual Studio, VS Code, na CLI do Azure ou Azure PowerShell um conjunto de credenciais de desenvolvedor, que podem ser usadas 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.