Compartilhar via


Conectar-se do aplicativo a recursos sem manipular credenciais

Os recursos do Azure com suporte a identidades gerenciadas sempre fornecem uma opção para especificar uma identidade gerenciada para se conectar aos recursos do Azure compatíveis com a autenticação do Microsoft Entra. O suporte a identidades gerenciadas torna desnecessário que os desenvolvedores gerenciem credenciais no código. As identidades gerenciadas são a opção de autenticação recomendada quando trabalhamos com recursos do Azure que dão suporte a elas. Leia uma visão geral das identidades gerenciadas.

Esta página demonstra como configurar um Serviço de Aplicativo para que ele possa se conectar ao Azure Key Vault, ao Armazenamento do Azure e ao Microsoft SQL Server. Esses mesmos princípios podem ser usados para qualquer recurso do Azure que dê suporte a identidades gerenciadas e que se conecte a recursos compatíveis com a autenticação do Microsoft Entra.

Os exemplos de código usam a biblioteca de clientes de Identidade do Azure, que é o método recomendado, pois ele gerencia automaticamente muitas das etapas para você, inclusive a aquisição do token de acesso usado na conexão.

A quais recursos as identidades gerenciadas podem se conectar?

Uma identidade gerenciada pode se conectar a qualquer recurso compatível com a autenticação do Microsoft Entra. Em geral, não há suporte especial necessário para que o recurso permita que identidades gerenciadas se conectem a ele.

Alguns recursos não são compatíveis com a autenticação do Microsoft Entra ou a biblioteca de clientes deles não é compatível com a autenticação por meio de token. Continue lendo para ver nossas diretrizes sobre como usar uma identidade gerenciada para acessar com segurança as credenciais sem precisar armazená-las no código ou nas configurações do aplicativo.

Como criar uma identidade gerenciada

dois tipos de identidades gerenciadas: atribuídas pelo sistema e atribuídas pelo usuário. As identidades atribuídas pelo sistema estão diretamente vinculadas a um recurso do Azure. Quando o recurso do Azure é excluído, a identidade também é. Uma identidade gerenciada atribuída pelo usuário pode ser associada a vários recursos do Azure e o ciclo de vida dela é independente desses recursos.

É altamente recomendável usar uma identidade gerenciada atribuída pelo usuário para a maioria dos cenários. Se o recurso de origem que você está usando não oferecer suporte a identidades gerenciadas atribuídas pelo usuário, você deverá consultar a documentação desse provedor de recursos a fim de saber como configurá-lo para ter uma identidade gerenciada atribuída pelo sistema.

Importante

A conta usada para criar identidades gerenciadas precisa de uma função, como "Colaborador de Identidade Gerenciada", para criar uma identidade gerenciada atribuída pelo usuário.

Crie uma identidade gerenciada atribuída pelo usuário usando sua opção preferida:

Após criar uma identidade gerenciada atribuída pelo usuário, anote os valores clientId e principalId exibidos quando a identidade gerenciada for criada. Você usará principalId ao adicionar permissões e clientId no código do aplicativo.

Configurar o Serviço de Aplicativos com uma identidade gerenciada atribuída pelo usuário

Para que você possa usar a identidade gerenciada em seu código, precisamos atribuí-la ao Serviço de Aplicativos que a usará. O processo de configuração de um Serviço de Aplicativos para usar uma identidade gerenciada atribuída pelo usuário requer que você especifique o identificador de recurso da identidade gerenciada na configuração do aplicativo.

Como adicionar permissões à identidade

Após configurar o Serviço de Aplicativos para usar uma identidade gerenciada atribuída pelo usuário, conceda as permissões necessárias à identidade. Nesse cenário, estamos usando essa identidade para interagir com o Armazenamento do Azure, portanto, você precisa usar o sistema RBAC (Controle de Acesso Baseado em Função) do Azure para conceder as permissões de identidade gerenciada atribuídas pelo usuário ao recurso.

Importante

Você precisará dispor de uma função semelhante a "Administrador de Acesso do Usuário" ou "Proprietário" do recurso de destino a fim de adicionar atribuições de função. Verifique se você está concedendo o privilégio mínimo necessário para que o aplicativo seja executado.

Todos os recursos que você deseja acessar exigem que você conceda as permissões de identidade. Por exemplo, se você solicitar um token para acessar o Key Vault, também precisará adicionar uma política de acesso que inclua a identidade gerenciada de seu aplicativo ou função. Caso contrário, as chamadas para o Key Vault serão rejeitadas, mesmo se você usar um token válido. O mesmo é verdadeiro para Banco de Dados SQL do Azure. Para saber mais sobre quais recursos dão suporte a tokens do Microsoft Entra, consulte os Serviços do Azure que dão suporte à autenticação do Microsoft Entra.

Como usar identidades gerenciadas no seu código

Depois de concluir as etapas descritas acima, o Serviço de Aplicativos tem uma identidade gerenciada com permissões para um recurso do Azure. Você pode usar a identidade gerenciada para obter um token de acesso que seu código pode usar para interagir com recursos do Azure, em vez de armazenar as credenciais no código.

Recomendamos que você use as bibliotecas de cliente que fornecemos para sua linguagem de programação preferida. Essas bibliotecas adquirem tokens de acesso para você, facilitando a autenticação com a ID do Microsoft Entra. Para obter mais informações, consulte bibliotecas de cliente para autenticação de identidades gerenciadas.

Usando uma biblioteca de identidades do Azure para acessar recursos do Azure

Cada uma das bibliotecas de Identidade do Azure fornece um tipo DefaultAzureCredential. DefaultAzureCredential tenta autenticar automaticamente o usuário por meio de fluxos diferentes, incluindo variáveis de ambiente ou uma entrada interativa. O tipo de credencial pode ser usado em um ambiente de desenvolvimento com suas próprias credenciais. Ele também pode ser usado no ambiente de produção do Azure por meio de uma identidade gerenciada. Nenhuma alteração de código é necessária ao implantar seu aplicativo.

Se você estiver usando identidades gerenciadas atribuídas pelo usuário, também deverá especificar explicitamente a identidade gerenciada atribuída pelo usuário com a qual deseja autenticar passando a ID do cliente da identidade como parâmetro. Você pode recuperar a ID do cliente navegando até a identidade no portal do Azure.

Como acessar um Blob no Armazenamento do Azure

using Azure.Identity;
using Azure.Storage.Blobs;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);                        

var blobServiceClient1 = new BlobServiceClient(new Uri("<URI of Storage account>"), credential);
BlobContainerClient containerClient1 = blobServiceClient1.GetBlobContainerClient("<name of blob>");
BlobClient blobClient1 = containerClient1.GetBlobClient("<name of file>");

if (blobClient1.Exists())
{
    var downloadedBlob = blobClient1.Download();
    string blobContents = downloadedBlob.Value.Content.ToString();                
}

Como acessar um segredo armazenado no Azure Key Vault

using Azure.Identity;
using Azure.Security.KeyVault.Secrets;
using Azure.Core;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};
var credential = new DefaultAzureCredential(credentialOptions);        

var client = new SecretClient(
    new Uri("https://<your-unique-key-vault-name>.vault.azure.net/"),
    credential);
    
KeyVaultSecret secret = client.GetSecret("<my secret>");
string secretValue = secret.Value;

Como acessar o Banco de Dados SQL do Azure

using Azure.Identity;
using Microsoft.Data.SqlClient;

// code omitted for brevity

// Specify the Client ID if using user-assigned managed identities
var clientID = Environment.GetEnvironmentVariable("Managed_Identity_Client_ID");
var credentialOptions = new DefaultAzureCredentialOptions
{
    ManagedIdentityClientId = clientID
};

AccessToken accessToken = await new DefaultAzureCredential(credentialOptions).GetTokenAsync(
    new TokenRequestContext(new string[] { "https://database.windows.net//.default" }));                        

using var connection = new SqlConnection("Server=<DB Server>; Database=<DB Name>;")
{
    AccessToken = accessToken.Token
};
var cmd = new SqlCommand("select top 1 ColumnName from TableName", connection);
await connection.OpenAsync();
SqlDataReader dr = cmd.ExecuteReader();
while(dr.Read())
{
    Console.WriteLine(dr.GetValue(0).ToString());
}
dr.Close();	

Usando a MSAL (Biblioteca de Autenticação da Microsoft) para acessar recursos do Azure

Além das bibliotecas de Identidade do Azure, você também pode usar a MSAL para acessar recursos do Azure usando identidades gerenciadas. Os snippets de código a seguir demonstram como usar a MSAL para acessar recursos do Azure em várias linguagens de programação.

Para identidades gerenciadas atribuídas pelo sistema, o desenvolvedor não precisa passar informações adicionais. A MSAL infere automaticamente os metadados relevantes sobre a identidade atribuída. Para identidades gerenciadas atribuídas pelo usuário, o desenvolvedor precisa passar a ID do cliente, o identificador de recurso completo ou a ID do objeto da identidade gerenciada.

Em seguida, você pode adquirir um token para acessar um recurso. Antes de usar identidades gerenciadas, os desenvolvedores devem habilitá-las para os recursos que desejam usar.

using Microsoft.Identity.Client;
using System;

string resource = "https://vault.azure.net";

// Applies to system-assigned managed identities only
IManagedIdentityApplication mi = ManagedIdentityApplicationBuilder.Create(ManagedIdentityId.SystemAssigned)
    .Build();

// Applies to user-assigned managed identities only
string userAssignedManagedIdentityClientId = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx";
IManagedIdentityApplication mi = ManagedIdentityApplicationBuilder.Create(ManagedIdentityId.WithUserAssignedClientId(userAssignedManagedIdentityClientId))
    .Build();

// Acquire token
AuthenticationResult result = await mi.AcquireTokenForManagedIdentity(resource)
    .ExecuteAsync()
    .ConfigureAwait(false);

if (!string.IsNullOrEmpty(result.AccessToken))
{
    Console.WriteLine(result.AccessToken);
}

Como se conectar a recursos que não são compatíveis com a autenticação do Microsoft Entra ID ou baseada em token nas bibliotecas

Alguns recursos do Azure não são compatíveis com a autenticação do Azure Microsoft Entra ou a biblioteca de clientes deles não é compatível com autenticação por meio de token. Normalmente, esses recursos são tecnologias de código aberto que esperam um nome de usuário e uma senha ou uma chave de acesso em uma cadeia de conexão.

Para evitar armazenar credenciais no código ou na configuração do aplicativo, você pode armazenar as credenciais como um segredo no Azure Key Vault. Usando o exemplo exibido acima, você pode recuperar o segredo do Azure Key Vault usando uma identidade gerenciada e passar as credenciais para a cadeia de conexão. Essa abordagem significa que nenhuma credenciais precisa ser tratada diretamente no código ou no ambiente. Para obter um exemplo detalhado, consulte Usar identidades gerenciadas para acessar certificados do Azure Key Vault. Para obter mais informações sobre a autenticação do Azure Key Vault, consulte a autenticação do Azure Key Vault.

Diretrizes para o caso de estar gerenciando tokens diretamente

Em alguns cenários, talvez seja interessante adquirir tokens para identidades gerenciadas manualmente em vez de usar um método interno para se conectar ao recurso de destino. Esses cenários não incluem nenhuma biblioteca de clientes para a linguagem de programação que você está usando ou o recurso de destino ao qual você está se conectando, ou se estiver se conectando a recursos que não estão em execução no Azure. Ao adquirir tokens manualmente, fornecemos as seguintes diretrizes:

Armazenar em cache os tokens adquiridos

Para desempenho e confiabilidade, recomendamos que seu aplicativo armazene tokens em cache na memória local ou criptografados, se quiser salvá-los em disco. Como os tokens de identidade gerenciada são válidos por 24 horas, não há nenhum benefício em solicitar novos tokens regularmente, pois um armazenado em cache será retornado do ponto de extremidade emissor do token. Se você exceder os limites de solicitação, será limitado por taxa e receberá um erro HTTP 429.

Ao adquirir um token, você pode definir seu cache de token para expirar 5 minutos antes de expires_on (ou propriedade equivalente) que será retornada quando o token for gerado.

Inspeção de token

Seu aplicativo não deve depender do conteúdo de um token. O conteúdo do token destina-se apenas ao público-alvo (recurso de destino) que está sendo acessado, não ao cliente que está solicitando o token. O conteúdo do token pode ser alterado ou criptografado no futuro.

Não expor nem mover tokens

Os tokens devem ser tratados como credenciais. Não os exponha a usuários ou outros serviços; por exemplo, soluções de registro em log/monitoramento. Eles não devem ser movidos do recurso de origem que os está usando, além de autenticar-se no recurso de destino.

Próximas etapas