Configurar um aplicativo para confiar em uma identidade gerenciada (versão prévia)
Este artigo descreve como configurar um aplicativo do Microsoft Entra para confiar em uma identidade gerenciada. Em seguida, você pode trocar o token de identidade gerenciada por um token de acesso que possa acessar recursos protegidos do Microsoft Entra sem precisar usar ou gerenciar segredos do aplicativo.
Pré-requisitos
- Uma conta do Azure com uma assinatura ativa. Crie uma conta gratuitamente.
- Essa conta do Azure deve ter permissões para gerenciar aplicativos, especificamente para atualizar permissões. Qualquer uma das seguintes funções do Microsoft Entra inclui as permissões necessárias:
- administrador de aplicativos
- Desenvolvedor de Aplicativos
- administrador de aplicativos de nuvem
- Uma compreensão dos conceitos em identidades gerenciadas para recursos do Azure.
- Uma identidade gerenciada atribuída pelo usuário atribuída ao recurso de computação do Azure (por exemplo, uma máquina virtual ou o Serviço de Aplicativo do Azure) que hospeda sua carga de trabalho.
- Um registro de aplicativo no Microsoft Entra ID. Esse registro de aplicativo deve pertencer ao mesmo locatário que a identidade gerenciada
- Se você precisar acessar recursos em outro locatário, o registro do aplicativo deverá ser um aplicativo multilocatário e provisionar o aplicativo no outro locatário. Além disso, você deve conceder permissões de acesso ao aplicativo nos recursos nesse tenant. Saiba mais sobre como adicionar um aplicativo multilocatário em outros locatários
- O registro do aplicativo deve ter acesso concedido aos recursos protegidos do Microsoft Entra (por exemplo, Azure, Microsoft Graph, Microsoft 365 etc.). Esse acesso pode ser concedido por meio de permissões de API ou permissões delegadas.
Considerações e restrições importantes
Para criar, atualizar ou excluir uma credencial de identidade federada, a conta que executa a ação deve ter a função administrador de aplicativos , do Desenvolvedor de Aplicativos, de Administrador de Aplicativos na Nuvem ou Proprietário do Aplicativo. A permissão microsoft.directory/applications/credentials/update é necessária para atualizar uma credencial de identidade federada.
Um máximo de 20 credenciais de identidade federadas podem ser adicionadas a um aplicativo ou identidade gerenciada atribuída pelo usuário.
Quando você configura uma credencial de identidade federada, há várias informações importantes a serem fornecidas:
O issuer e o subject são as principais informações necessárias para configurar a relação de confiança. A combinação de
issuer
esubject
deve ser exclusiva no aplicativo. Quando a carga de trabalho do Azure solicita à plataforma de identidade da Microsoft para trocar o token de Identidade Gerenciada por um token de acesso, os valores do emissor e do sujeito da credencial de identidade federada são verificados em relação às declaraçõesissuer
esubject
fornecidas no token de Identidade Gerenciada. Se essa verificação de validação for aprovada, a plataforma de identidade da Microsoft emitirá um token de acesso para a carga de trabalho de software externo.issuer é a URL da URL de Autoridade do locatário do Microsoft Entra no formulário
https://login.microsoftonline.com/{tenant}/v2.0
. O Aplicativo Microsoft Entra e a Identidade Gerenciada devem pertencer ao mesmo locatário. Se a declaraçãoissuer
tiver espaço em branco à esquerda ou à direita no valor, a troca de tokens será bloqueada.Importante
Embora o registro do aplicativo e a identidade gerenciada precisem estar no mesmo locatário, a entidade de serviço do registro do aplicativo ainda pode resgatar o token da identidade gerenciada.
subject é o GUID da ID de Objeto da Identidade Gerenciada (ID da Entidade de Segurança) atribuído à carga de trabalho do Azure. A plataforma de identidade da Microsoft examina o token externo de entrada e rejeita a troca de um token de acesso se o assunto campo configurado na Credencial de Identidade Federada não corresponder à ID principal da Identidade Gerenciada. O GUID diferencia maiúsculas e minúsculas.
-
Importante
Você só pode usar Identidades Gerenciadas User-Assigned neste recurso.
*audiences listam os públicos-alvo que podem aparecer no token externo (obrigatório). Você deve adicionar um único valor de audiência, que tem um limite de 600 caracteres. O valor deve ser um dos seguintes e deve corresponder ao valor da declaração
aud
no token de Identidade Gerenciada.- Nuvem pública:
api://AzureADTokenExchange
- Fairfax:
api://AzureADTokenExchangeUSGov
- bolo de lua:
api://AzureADTokenExchangeChina
- USNat:
api://AzureADTokenExchangeUSNat
- USSec:
api://AzureADTokenExchangeUSSec
Importante
Se você adicionar acidentalmente as informações incorretas na configuração issuer, subject ou audience, a credencial de identidade federada será criada com êxito sem erros. O erro não se torna aparente até que a troca de tokens falhe.
- Nuvem pública:
nome é o identificador exclusivo da credencial de identidade federada. (Obrigatório) Esse campo tem um limite de caracteres de 3 a 120 caracteres e deve ser amigável à URL. Há suporte para caracteres alfanuméricos, traços ou sublinhados, e o primeiro caractere precisa ser apenas alfanumérico. É imutável uma vez criado.
descrição é a descrição fornecida pelo usuário da credencial de identidade federada (opcional). A descrição não é validada ou verificada pela ID do Microsoft Entra. Esse campo tem um limite de 600 caracteres.
Não há suporte para caracteres curinga em valores da propriedade de credencial de identidade federada.
Obter a ID do objeto da identidade gerenciada
- Entre no portal do Azure.
- Na caixa de pesquisa, insira Identidades gerenciadas. Em Services, selecione Identidades Gerenciadas.
- Pesquise e selecione a identidade gerenciada atribuída a usuário que você criou como parte dos pré-requisitos .
- No painel Visão geral, copie o valor da ID do objeto (entidade de segurança). Esse valor é usado como o campo subject na configuração de credencial federada.
Configurar uma credencial de identidade federada em um aplicativo existente
Nesta seção, você configurará uma credencial de identidade federada em um aplicativo existente para confiar em uma identidade gerenciada. Use as guias a seguir para escolher como configurar uma credencial de identidade federada em um aplicativo existente.
Entre no Centro de administração do Microsoft Entra. Verifique se você está no locatário em que seu aplicativo está registrado.
Navegue até Identidade>Aplicativos>Registros de aplicativo e selecione seu aplicativo na janela principal.
Em Gerenciar, selecione Certificados e Segredos.
Selecione a guia Credenciais Federadas e selecione Adicionar credencial.
No Cenário de credencial federada, na lista suspensa, selecione Outro emissor e preencha os valores de acordo com a seguinte tabela:
Campo Descrição Exemplo Emissor A URL do emissor OAuth 2.0/OIDC da autoridade de ID do Microsoft Entra. https://login.microsoftonline.com/{tenantID}/v2.0
Identificador de assunto A GUID Principal ID
da Identidade Gerenciada.aaaaaaaa-0000-1111-2222-bbbbbbbbbbbb
Nome Um nome descritivo exclusivo para a credencial. msi-webapp1 Descrição (opcional) Uma descrição fornecida pelo usuário da credencial de identidade federada. Confie nas cargas de trabalho UAMI para representar o aplicativo Público O valor de público-alvo que deve aparecer no token externo. • nuvem pública: api://AzureADTokenExchange
• Fairfax: api://AzureADTokenExchangeUSGov
• Mooncake: api://AzureADTokenExchangeChina
• USNat: api://AzureADTokenExchangeUSNat
• USSec: api://AzureADTokenExchangeUSSec
Atualizar o código do aplicativo para solicitar um token de acesso
Os exemplos de código na tabela a seguir mostram fluxos de credencial de cliente "serviço a serviço". Porém, as identidades gerenciadas como uma credencial podem ser usadas em outros fluxos de autenticação, como fluxos em nome de (OBO). Os exemplos são válidos em ambos os casos, quando o locatário do recurso está no mesmo locatário que o registro do aplicativo e a identidade gerenciada e quando está em um locatário diferente.
Azure.Identity
O exemplo a seguir demonstra como se conectar a um contêiner de armazenamento do Azure usando Azure.Identity
, mas pode ser adaptado para acessar qualquer recurso protegido pelo Microsoft Entra. Os exemplos são válidos em ambos os casos, quando o locatário do recurso está no mesmo locatário que o registro do aplicativo e a identidade gerenciada e quando está em um locatário diferente.
using Azure.Identity;
using Azure.Storage.Blobs;
internal class Program
{
// This example demonstrates how to access an Azure blob storage account by utilizing the manage identity credential.
static void Main(string[] args)
{
string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
string containerName = "CONTAINER_NAME";
// The application must be granted access on the target resource
string appClientId = "YOUR_APP_CLIENT_ID";
// The tenant where the target resource is created, in this example, the storage account tenant
// If the resource tenant different from the app tenant, your app needs to be
string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
// The managed identity which you configured as a Federated Identity Credential (FIC)
string miClientId = "YOUR_MANAGED_IDENTITY_CLIENT_ID";
// Audience value must be one of the below values depending on the target cloud.
// Public cloud: api://AzureADTokenExchange
// Fairfax: api://AzureADTokenExchangeUSGov
// Mooncake: api://AzureADTokenExchangeChina
// USNat: api://AzureADTokenExchangeUSNat
// USSec: api://AzureADTokenExchangeUSSec
string audience = "api://AzureADTokenExchange";
// 1. Create an assertion with the managed identity access token, so that it can be exchanged an app token
var miCredential = new ManagedIdentityCredential(managedIdentityClientId);
ClientAssertionCredential assertion = new(
tenantId,
appClientId,
async (token) =>
{
// fetch Managed Identity token for the specified audience
var tokenRequestContext = new Azure.Core.TokenRequestContext(new[] { $"{audience}/.default" });
var accessToken = await miCredential.GetTokenAsync(tokenRequestContext).ConfigureAwait(false);
return accessToken.Token;
});
// 2. The assertion can be used to obtain an App token (taken care of by the SDK)
var containerClient = new BlobContainerClient(new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"), assertion);
await foreach (BlobItem blob in containerClient.GetBlobsAsync())
{
// TODO: perform operations with the blobs
BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
Console.WriteLine($"Blob name: {blobClent.Name}, uri: {blobClient.Uri}");
}
}
}
Microsoft.Identity.Web
No Microsoft.Identity.Web, um aplicativo Web ou API Web pode substituir o certificado do cliente por uma declaração de cliente assinada para autenticação. Em seu aplicativo, você pode atualizar a seção ClientCredentials
em seu appsettings.json para a seguinte configuração:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"ClientId": "YOUR_APPLICATION_ID",
"TenantId": "YOUR_TENANT_ID",
"ClientCredentials": [
{
"SourceType": "SignedAssertionFromManagedIdentity",
"ManagedIdentityClientId": "YOUR_USER_ASSIGNED_MANAGED_IDENTITY_CLIENT_ID",
"TokenExchangeUrl":"api://AzureADTokenExchange"
}
]
}
}
MSAL (.NET)
Em MSAL, você pode utilizar a classe ManagedClientApplication para obter um token de identidade gerenciada. Esse token pode ser usado como uma declaração de cliente ao construir um aplicativo cliente confidencial.
Aviso
Para aplicativos .NET, recomendamos usar bibliotecas de nível superior baseadas na MSAL, como Microsoft.Identity.Web ou Azure.Identity.
using Microsoft.Identity.Client;
using Azure.Storage.Blobs;
using Azure.Core;
internal class Program
{
static async Task Main(string[] args)
{
string storageAccountName = "YOUR_STORAGE_ACCOUNT_NAME";
string containerName = "CONTAINER_NAME";
string appClientId = "YOUR_APP_CLIENT_ID";
string resourceTenantId = "YOUR_RESOURCE_TENANT_ID";
Uri authorityUri = new($"https://login.microsoftonline.com/{resourceTenantId}");
string miClientId = "YOUR_MI_CLIENT_ID";
string audience = "api://AzureADTokenExchange";
// Get mi token to use as assertion
var miAssertionProvider = async (AssertionRequestOptions _) =>
{
var miApplication = ManagedIdentityApplicationBuilder
.Create(ManagedIdentityId.WithUserAssignedClientId(miClientId))
.Build();
var miResult = await miApplication.AcquireTokenForManagedIdentity(audience)
.ExecuteAsync()
.ConfigureAwait(false);
return miResult.AccessToken;
};
// Create a confidential client application with the assertion.
IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(appClientId)
.WithAuthority(authorityUri, false)
.WithClientAssertion(miAssertionProvider)
.WithCacheOptions(CacheOptions.EnableSharedCacheOptions)
.Build();
// Get the federated app token for the storage account
string[] scopes = [$"https://{storageAccountName}.blob.core.windows.net/.default"];
AuthenticationResult result = await app.AcquireTokenForClient(scopes).ExecuteAsync().ConfigureAwait(false);
TokenCredential tokenCredential = new AccessTokenCredential(result.AccessToken);
var client = new BlobContainerClient(
new Uri($"https://{storageAccountName}.blob.core.windows.net/{containerName}"),
tokenCredential);
await foreach (BlobItem blob in containerClient.GetBlobsAsync())
{
// TODO: perform operations with the blobs
BlobClient blobClient = containerClient.GetBlobClient(blob.Name);
Console.WriteLine($"Blob name: {blobClient.Name}, URI: {blobClient.Uri}");
}
}
}