Configurar um aplicativo para confiar em uma identidade gerenciada (visualização)
Este artigo descreve como configurar um aplicativo Microsoft Entra para confiar em uma identidade gerenciada. Em seguida, você pode trocar o token de identidade gerenciado por um token de acesso que pode 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 permissões de atualização. Qualquer uma das seguintes funções do Microsoft Entra inclui as permissões necessárias:
- 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 registo de aplicação no Microsoft Entra ID. Este registo da aplicação tem de pertencer ao mesmo inquilino que a identidade gerida
- 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 desse locatário. 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 o de Administrador de Aplicativos, de Desenvolvedor de Aplicativos, de Administrador de Aplicativos na Nuvem ou a função de Proprietário do Aplicativo. O de permissão microsoft.directory/applications/credentials/update é necessário para atualizar uma credencial de identidade federada.
Um máximo de 20 credenciais de identidade federada pode ser adicionado 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:
do emitente e assunto são as principais informações necessárias para estabelecer 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 que a plataforma de identidade da Microsoft troque o token de Identidade Gerenciada por um token de acesso, o do emissor dee valores de de assunto da credencial de identidade federada são verificados em relação às declarações dee 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 à carga de trabalho de software externo. do emissor é a URL da Autoridade do locatário do Microsoft Entra no formato
https://login.microsoftonline.com/{tenant}/v2.0
. O Aplicativo Microsoft Entra e a Identidade Gerenciada devem pertencer ao mesmo locatário. Se a declaração deissuer
tiver espaço em branco à esquerda ou à direita no valor, a troca de token será bloqueada.Importante
Embora o registo da aplicação e a identidade gerida devam estar no mesmo locatário, o principal de serviço do registo da aplicação ainda pode resgatar o token de identidade gerida.
assunto é o GUID da ID de Objeto (ID Principal) da Identidade Gerenciada atribuída à carga de trabalho do Azure. A plataforma de identidade da Microsoft examina o token externo de entrada e rejeita a troca por um token de acesso se o campo de assunto
configurado na Credencial de Identidade Federada não corresponder à ID Principal da Identidade Gerenciada. O GUID é sensível a maiúsculas e minúsculas. -
Importante
Você só pode usar User-Assigned Identidades Gerenciadas neste recurso.
*audiences listam os públicos 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 de
aud
no token de Identidade Gerenciada.-
: nuvem pública:
api://AzureADTokenExchange
-
Fairfax:
api://AzureADTokenExchangeUSGov
-
Mooncake:
api://AzureADTokenExchangeChina
-
USNat:
api://AzureADTokenExchangeUSNat
-
USSec:
api://AzureADTokenExchangeUSSec
Importante
Se adicionar acidentalmente informações incorretas nodo emissor
, assunto oupúblico , a credencial de identidade federada será criada com sucesso e sem erro. O erro não se torna aparente até que a troca de token falhe.-
: nuvem pública:
nome é o identificador exclusivo da credencial de identidade federada. (Obrigatório) Este campo tem um limite de caracteres de 3 a 120 caracteres e deve ser amigável para URL. Há suporte para caracteres alfanuméricos, traços ou sublinhados, e o primeiro caractere deve 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. Este campo tem um limite de 600 caracteres.
Não há suporte para caracteres universais em nenhum valor nas propriedades das credenciais de identidade federada.
Obter a ID do objeto da identidade gerenciada
- Inicie sessão no portal do Azure.
- Na caixa de pesquisa, introduza Identidades Geridas. Em Serviços, selecione Identidades Gerenciadas.
- Procure e selecione a identidade gerenciada atribuída pelo usuário que você criou como parte dos pré-requisitos .
- No painel Visão Geral, copie o valor do ID do objeto (principal) . Esse valor é usado como o campo assunto na configuração de credenciais federadas.
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.
- Centro de administração do Microsoft Entra
- da CLI do Azure
- PowerShell
- APIs
- Bíceps
Entre no centro de administração do Microsoft Entra. Verifique se está no locatário onde a sua aplicação está registada.
Navegue até Identity>Applications>Registros de aplicativose selecione seu aplicativo na janela principal.
Em Gerenciar, selecione Certificados & segredos.
Selecione a guia Credenciais federadas e selecione Adicionar credencial.
No menu suspenso do cenário de credenciais federadas
, selecione Outros Emissores e preencha os valores, de acordo com a tabela a seguir:Campo Descrição Exemplo Emissor A URL do emissor OAuth 2.0 / OIDC da autoridade Microsoft Entra ID. https://login.microsoftonline.com/{tenantID}/v2.0
Identificador do assunto O 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-alvo O valor de audiência que deve aparecer no token externo. • Nuvem pública: api://AzureADTokenExchange
• Fairfax: api://AzureADTokenExchangeUSGov
• Mooncake: api://AzureADTokenExchangeChina
• USNat: api://AzureADTokenExchangeUSNat
• USSec: api://AzureADTokenExchangeUSSec
Atualize o código do aplicativo para solicitar um token de acesso
Os exemplos de código a seguir na tabela a seguir mostram fluxos de credenciais de cliente "serviço a serviço". No entanto, 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, quer o locatário do recurso esteja no mesmo locatário que o registo da aplicação e a identidade gerida, ou 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 registo do aplicativo e a identidade gerida, ou num 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
Em 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)
No MSAL, pode usar a classe ManagedClientApplication para adquirir um token de Identidade Gerida. Esse token pode ser usado como uma asserção de cliente ao construir um aplicativo cliente confidencial.
Advertência
Para aplicativos .NET, é altamente recomendável usar bibliotecas de nível superior baseadas no 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}");
}
}
}