Como autenticar aplicativos .NET nos serviços do Azure usando o SDK do Azure .NET

Quando um aplicativo precisa acessar um recurso do Azure, como armazenamento, cofre de chaves ou serviços cognitivos, o aplicativo deve ser autenticado no Azure. Isso é verdade para todos os aplicativos, sejam eles implantados no Azure, implantados no local ou em desenvolvimento em uma estação de trabalho de desenvolvedor local. Este artigo descreve as abordagens recomendadas para autenticar um aplicativo no Azure ao usar o SDK do Azure para .NET.

É recomendável que os aplicativos usem autenticação baseada em token em vez de cadeias de conexão ao autenticar em recursos do Azure. O SDK do Azure para .NET fornece classes que dão suporte à autenticação baseada em token e permitem que os aplicativos se autentiquem diretamente nos recursos do Azure, quer o aplicativo esteja em desenvolvimento local, implantado no Azure ou implantado em um servidor local.

O tipo específico de autenticação baseada em token que um aplicativo deve usar para autenticar nos recursos do Azure depende de onde o aplicativo está sendo executado e é mostrado no diagrama a seguir.

Um diagrama mostrando as estratégias de autenticação baseadas em tokens recomendadas para um aplicativo, dependendo de onde ele está sendo executado.

  • Quando um desenvolvedor está executando um aplicativo durante o desenvolvimento local - O aplicativo pode se autenticar no Azure usando uma entidade de serviço de aplicativo para desenvolvimento local ou usando as credenciais do Azure do desenvolvedor. Cada uma dessas opções é discutida com mais detalhes na seção autenticação durante o desenvolvimento local.
  • Quando um aplicativo é hospedado no Azure - O aplicativo deve se autenticar nos recursos do Azure usando uma identidade gerenciada. Essa opção é discutida com mais detalhes abaixo na seção autenticação em ambientes de servidor.
  • Quando um aplicativo é hospedado e implantado localmente - O aplicativo deve se autenticar nos recursos do Azure usando uma entidade de serviço de aplicativo. Essa opção é discutida com mais detalhes abaixo na seção autenticação em ambientes de servidor.

DefaultAzureCredential

A DefaultAzureCredential classe fornecida pelo SDK do Azure permite que os aplicativos usem métodos de autenticação diferentes, dependendo do ambiente em que são executados. Isso permite que os aplicativos sejam promovidos do desenvolvimento local para ambientes de teste e produção sem alterações de código. Você configura o método de autenticação apropriado para cada ambiente e DefaultAzureCredential detetará e usará automaticamente esse método de autenticação. O uso de deve ser preferido sobre a codificação manual de lógica condicional ou sinalizadores de recurso para usar diferentes métodos de DefaultAzureCredential autenticação em diferentes ambientes.

Os detalhes sobre como usar a DefaultAzureCredential classe são abordados mais adiante neste artigo na seção Usar DefaultAzureCredential em um aplicativo.

Vantagens da autenticação baseada em tokens

A autenticação baseada em tokens é altamente recomendada em vez do uso de cadeias de conexão ao criar aplicativos para o Azure. A autenticação baseada em token oferece as seguintes vantagens em relação à autenticação com cadeias de conexão.

  • Os métodos de autenticação baseados em tokens descritos abaixo permitem que você estabeleça as permissões específicas necessárias para o aplicativo no recurso do Azure. Isto segue o princípio do menor privilégio. Por outro lado, uma cadeia de conexão concede direitos completos ao recurso do Azure.
  • Enquanto qualquer pessoa ou qualquer aplicativo com uma cadeia de conexão pode se conectar a um recurso do Azure, os métodos de autenticação baseados em token abrangem o acesso ao recurso somente ao(s) aplicativo(s) destinado(s) a acessar o recurso.
  • No caso de uma identidade gerenciada, não há nenhum segredo de aplicativo para armazenar. Isso torna o aplicativo mais seguro porque não há nenhuma cadeia de conexão ou segredo do aplicativo que possa ser comprometido.
  • O pacote Azure.Identity no SDK do Azure gerencia tokens para você nos bastidores. Isso torna o uso da autenticação baseada em token tão fácil de usar quanto uma cadeia de conexão.

O uso de cadeias de conexão deve ser limitado a aplicativos de prova de conceito iniciais ou protótipos de desenvolvimento que não acessam dados confidenciais ou de produção. Caso contrário, as classes de autenticação baseada em token disponíveis no SDK do Azure devem sempre ser preferidas ao autenticar nos recursos do Azure.

Autenticação em ambientes de servidor

Ao hospedar em um ambiente de servidor, cada aplicativo deve receber uma identidade de aplicativo exclusiva por ambiente em que o aplicativo é executado. No Azure, uma identidade de aplicativo é representada por uma entidade de serviço, um tipo especial de entidade de segurança destinada a identificar e autenticar aplicativos no Azure. O tipo de entidade de serviço a ser usada para seu aplicativo depende de onde ele está sendo executado.

Método de autenticação Description
Aplicativos hospedados no Azure Os aplicativos hospedados no Azure devem usar uma entidade de serviço de Identidade Gerenciada. As identidades gerenciadas são projetadas para representar a identidade de um aplicativo hospedado no Azure e só podem ser usadas com aplicativos hospedados do Azure.

Por exemplo, um aplicativo Web .NET hospedado no Serviço de Aplicativo do Azure receberia uma Identidade Gerenciada. A Identidade Gerenciada atribuída ao aplicativo seria usada para autenticar o aplicativo em outros serviços do Azure.

Aplicativos hospedados fora do Azure
(por exemplo, aplicativos locais)
Os aplicativos hospedados fora do Azure (por exemplo, aplicativos locais) que precisam se conectar aos serviços do Azure devem usar uma entidade de serviço de aplicativo. Uma entidade de serviço de aplicativo representa a identidade do aplicativo no Azure e é criada por meio do processo de registro do aplicativo.

Por exemplo, considere um aplicativo Web .NET hospedado no local que use o Armazenamento de Blobs do Azure. Você criaria uma entidade de serviço de aplicativo para o aplicativo usando o processo de registro do aplicativo. O AZURE_CLIENT_ID, AZURE_TENANT_IDe AZURE_CLIENT_SECRET todos seriam armazenados como variáveis de ambiente para serem lidos pelo aplicativo em tempo de execução e permitir que o aplicativo se autentique no Azure usando a entidade de serviço de aplicativo.

Autenticação durante o desenvolvimento 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. As duas principais estratégias para autenticar aplicativos no Azure durante o desenvolvimento local são:

Método de autenticação Description
Criar objetos principais de serviço de aplicativo dedicados a serem usados durante o desenvolvimento local Nesse método, objetos principais de serviço de aplicativo dedicados são configurados usando o processo de registro de aplicativo para uso durante o desenvolvimento local. A identidade da entidade de serviço é então armazenada como variáveis de ambiente a serem acessadas pelo aplicativo quando ele é executado no desenvolvimento local.

Esse método permite que você atribua as permissões de recursos específicas necessárias para o aplicativo aos objetos principais de serviço usados pelos desenvolvedores durante o desenvolvimento local. Isso garante que o aplicativo tenha acesso apenas aos recursos específicos de que precisa e replica as permissões que o aplicativo terá em produção.

A desvantagem dessa abordagem é a necessidade de criar objetos de entidade de serviço separados para cada desenvolvedor que trabalha em um aplicativo.

Autenticar o aplicativo no Azure usando as credenciais do desenvolvedor durante o desenvolvimento local Neste método, um programador tem de ter sessão iniciada no Azure a partir do Visual Studio, da extensão Ferramentas do Azure para VS Code, da CLI do Azure ou do Azure PowerShell na estação de trabalho local. O aplicativo pode acessar as credenciais do desenvolvedor do repositório de credenciais e usar essas credenciais para acessar os recursos do Azure a partir do aplicativo.

Este método tem a vantagem de uma configuração mais fácil, uma vez que um programador só precisa de iniciar sessão na sua conta do Azure a partir do Visual Studio, VS Code ou da CLI do Azure. A desvantagem dessa abordagem é que a conta do desenvolvedor provavelmente tem mais permissões do que o exigido pelo aplicativo. Portanto, essa abordagem não replica com precisão as permissões com as quais o aplicativo será executado na produção.

Usar DefaultAzureCredential em um 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.

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

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

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.

  1. Inclua os Azure.Identity namespaces e Microsoft.Extensions.Azure com uma instrução using.
  2. Registre o serviço do Azure usando métodos auxiliares relevantes.
  3. 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.

Explorando a sequência de métodos de autenticação DefaultAzureCredential

Internamente, DefaultAzureCredential implementa uma cadeia de provedores de credenciais para autenticar aplicativos nos recursos do Azure. Cada provedor de credenciais é capaz de detetar se credenciais desse tipo estão configuradas para o aplicativo. DefaultAzureCredential Verifica sequencialmente cada provedor em ordem e usa as credenciais do primeiro provedor que tem credenciais configuradas.

A ordem e os locais em que DefaultAzureCredential procura credenciais são encontrados em DefaultAzureCredential.

Tipo de credencial Description
Entidade de serviço do aplicativo DefaultAzureCredential Lê um conjunto de variáveis de ambiente para determinar se uma entidade de serviço de aplicativo (usuário do aplicativo) foi definida para o aplicativo. Em caso afirmativo, DefaultAzureCredential usa esses valores para autenticar o aplicativo no Azure.

Este método é mais frequentemente usado em ambientes de servidor, mas também pode ser usado ao desenvolver localmente.
Identidade Gerida Se o aplicativo for implantado em um host do Azure com a Identidade Gerenciada habilitada, DefaultAzureCredential autenticará o aplicativo no Azure usando essa Identidade Gerenciada. A autenticação usando uma identidade gerenciada é discutida na seção Autenticação em ambientes de servidor deste documento.

Esse método só está disponível quando um aplicativo é hospedado no Azure usando um serviço como o Serviço de Aplicativo do Azure, o Azure Functions ou as Máquinas Virtuais do Azure.
Visual Studio Se o desenvolvedor tiver se autenticado no Azure fazendo logon no Visual Studio, DefaultAzureCredential autenticará o aplicativo no Azure usando essa mesma conta.
Visual Studio Code Se o desenvolvedor tiver se autenticado no Azure usando o plug-in da Conta do Azure do Visual Studio Code, DefaultAzureCredential autenticará o aplicativo no Azure usando essa mesma conta.
CLI do Azure Se um desenvolvedor tiver se autenticado no Azure usando o az login comando na CLI do Azure, DefaultAzureCredential autenticará o aplicativo no Azure usando essa mesma conta.
Azure PowerShell Se um desenvolvedor tiver se autenticado no Azure usando o Connect-AzAccount cmdlet do Azure PowerShell, DefaultAzureCredential autenticará o aplicativo no Azure usando essa mesma conta.
Interativo Se ativado, DefaultAzureCredential autenticará interativamente o desenvolvedor através do navegador padrão do sistema atual. Por padrão, essa opção está desativada.