Configurar la identidad gestionada de Power Platform para complementos o paquetes de complementos de Dataverse

Cuando se usa la identidad administrada de Power Platform, los complementos o paquetes de complementos de Dataverse pueden conectarse a recursos de Azure sin administrar credenciales. En este artículo se describe la configuración recomendada (versión 2), que compila la credencial de identidad federada (FIC) a partir de un hash del nombre distintivo completo del certificado (DN).

Nota:

Use la identidad administrada de Power Platform versión 2 para todos los complementos nuevos y existentes. Si mantiene un complemento que sigue usando el formato de versión 1 (basado en CN), consulte Configuración de la identidad administrada versión 1. Para mover un complemento existente a la versión 2, consulte Actualización a la versión 2.

Por qué la versión 2

La versión 2 genera un identificador de sujeto de solo ASCII de longitud fija, por lo que funciona con cualquier nombre de certificado. Se produce un error en la versión 1 en determinados nombres de certificado (CN):

  • Caracteres no ASCII en el CN (por ejemplo, letras acentuadas) → AADSTS70050: The Federated Managed Identity path is not properly formatted.
  • Comas en el CN (por ejemplo, CN=Contoso, Inc.) → AADSTS700213: No matching federated identity record found.

Prerrequisitos

  • Una suscripción de Azure con acceso para aprovisionar la identidad administrada asignada por el usuario (UAMI) o el registro de aplicaciones.
  • Herramientas para complementos o paquetes de complementos:
  • Certificado válido para firmar el ensamblado del complemento.

Configuración de la identidad administrada

  1. Cree un nuevo registro de aplicación o una identidad administrada asignada por el usuario.
  2. Compile, firme y registre el complemento.
  3. Configure la credencial de identidad federada.
  4. Cree el registro de identidad administrada en Dataverse.
  5. Conceda acceso al recurso de Azure.
  6. Valide la integración.

Paso 1: Crear un registro de aplicación o una identidad administrada asignada por el usuario

Cree una identidad administrada asignada por el usuario o una aplicación en Microsoft Entra ID:

Nota:

Capture el identificador de la aplicación (cliente) y el identificador de inquilino : los usará en pasos posteriores.

Paso 2: Compilar, firmar y registrar el complemento

  1. Cree un complemento en Visual Studio. Use el identificador de inquilino del paso 1 y un ámbito como https://{OrgName}.crm*.dynamics.com/.default. Use IManagedIdentityService para solicitar un token:

    string AcquireToken(IEnumerable<string> scopes);
    
  2. Firme el complemento con su certificado.

    Paquete de complemento (NuGet):

    nuget sign YourPlugin.nupkg `
      -CertificatePath MyCert.pfx `
      -CertificatePassword "MyPassword" `
      -Timestamper http://timestamp.digicert.com
    

    Ensamblado de complemento (SignTool):

    signtool sign /f MyCert.pfx /p MyPassword /t http://timestamp.digicert.com /fd SHA256 MyAssembly.dll
    
  3. Registre el complemento mediante la herramienta de registro del complemento.

Nota:

Use un certificado autofirmado solo para desarrollo o pruebas. No use certificados autofirmados en producción. Para crear uno, consulte Generación de un certificado autofirmado.

Paso 3: Configurar la credencial de identidad federada

En el portal de Azure, abra la aplicación o la identidad administrada asignada por el usuario (UAMI), vaya a Certificados y secretos>>Agregar credenciales y seleccione Otro emisor. A continuación, escriba:

  • Emisor : https://login.microsoftonline.com/{tenantID}/v2.0

  • Tipo : identificador de sujeto explícito

  • Identificador del sujeto — utilice el formato correspondiente a su tipo de certificado:

    • Certificado de emisor de confianza (producción):

      /eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/i/{issuerHash}/s/{subjectHash}
      
    • Certificado autofirmado (solo para desarrollo):

      /eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/h/{hash}
      

    Referencia de segmento

    Segmento Descripción
    eid1 Versión del formato de identidad
    c/pub Código en la nube para la nube pública, GCC y la primera estación de lanzamiento en GCC
    t/{encodedTenantId} Identificador de inquilino. Consulte Obtención del identificador de inquilino codificado.
    a/qzXoWDkuqUa3l6zM5mM0Rw/ Solo uso interno. No modificar
    n/plugin Componente de complemento
    e/{environmentId} Id. de entorno
    i/{issuerHash} s/{subjectHash} Hash SHA-256 Base64URL del DN completo del emisor/sujeto. Consulte Calcular los hashes del emisor y del sujeto
    h/{hash} SHA-256 del certificado (solo autofirmado)

Calcular los hashes del emisor y del sujeto

Calcule el hash SHA-256 de las cadenas DN completas del emisor y del asunto, tal como aparecen en el certificado, y codifique cada una en Base64 seguro para URL. Obtenga las secuencias DN con:

$cert = Get-PfxCertificate -FilePath "path\to\your.pfx"
Write-Host "Issuer:  $($cert.Issuer)"
Write-Host "Subject: $($cert.Subject)"

Calcule los hash (PowerShell):

function Get-Sha256Base64Url {
    param([string]$InputString)
    $bytes = [System.Text.Encoding]::UTF8.GetBytes($InputString)
    $sha256 = [System.Security.Cryptography.SHA256]::Create()
    $hash = $sha256.ComputeHash($bytes)
    $base64 = [Convert]::ToBase64String($hash)
    return $base64.Replace('+', '-').Replace('/', '_').TrimEnd('=')
}

$issuerHash = Get-Sha256Base64Url -InputString "<full issuer DN string>"
$subjectHash = Get-Sha256Base64Url -InputString "<full subject DN string>"
Write-Host "Issuer Hash:  $issuerHash"
Write-Host "Subject Hash: $subjectHash"

O bien en C#:

using System.Security.Cryptography;
using System.Text;

static string ComputeSha256Base64Url(string input)
{
    using var sha256 = SHA256.Create();
    byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(input));
    return Convert.ToBase64String(hashBytes)
        .Replace('+', '-')
        .Replace('/', '_')
        .TrimEnd('=');
}

La salida es una cadena de 43 caracteres que contiene solo A-Z, a-z, 0-9, - y _.

Importante

Use la cadena DN exacta que usa el entorno de ejecución (las propiedades X509Certificate2.Issuer .NET y X509Certificate2.Subject). Un DN con formato diferente no coincidirá y se producirá un error con AADSTS700213.

Nota:

En el caso de las implementaciones fuera de la nube pública, establezca valores específicos de la nube. Consulte Entornos de nube Azure especializados.

Paso 4: Creación del registro de identidad administrada en Dataverse

Envíe una solicitud HTTP POST mediante un cliente REST. Para la versión 2, establezca version en 2.

POST https://<<orgURL>>/api/data/v9.0/managedidentities
{
  "applicationid": "<<appId>>",
  "managedidentityid": "<<anyGuid>>",
  "credentialsource": 2,
  "subjectscope": 1,
  "tenantid": "<<tenantId>>",
  "version": 2
}

A continuación, enlace el ensamblado del complemento (o paquete) al registro:

PATCH https://<<orgURL>>/api/data/v9.0/pluginassemblies(<<PluginAssemblyId>>)
{
  "managedidentityid@odata.bind": "/managedidentities(<<ManagedIdentityGuid>>)"
}

En el caso de un paquete de complemento, use pluginpackages(<<PluginPackageId>>) en su lugar.

Paso 5: Conceder acceso al recurso de Azure

Conceda a la aplicación o a la identidad administrada asignada por el usuario acceso al recurso Azure que necesita, como Azure Key Vault.

Paso 6: Validar la integración

Desencadene el complemento y confirme que adquiere un token y llega al recurso Azure sin credenciales independientes.

Actualización a la versión 2

Si tiene un complemento en la versión 0 o la versión 1, puede moverlo a la versión 2 sin volver a generar o volver a registrar el complemento.

Opción 1: CLI de Power Platform

Nota:

Los verbos de identidad administrada de la CLI no funcionan en sistemas operativos basados en Linux ni con identidad administrada asignada por el usuario (UAMI). Si la CLI no funciona para el certificado, use la opción 2: Manual.

  1. Instale la VERSIÓN 2.8.1 o posterior de la CLI de Power Platform. Consulte Instalación de la CLI de Microsoft Power Platform.
  2. Cree un perfil de autenticación: pac auth create
  3. Compruebe la versión actual: pac managed-identity show-fic --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --version 2
  4. Actualizar: pac managed-identity upgrade-version --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --target-version 2 --confirm
  5. Desencadene el complemento para validarlo.

Opción 2: Manual

  1. Calcule los hashes de emisor y de sujeto de la versión 2. Consulte Calcular los hashes del emisor y del sujeto.

  2. Agregar un nuevo FIC con el formato de identificador de sujeto de la versión 2 (Paso 3).

  3. Actualice el registro de identidad administrada a la versión 2:

    PATCH https://<<orgURL>>/api/data/v9.0/managedidentities(<<ManagedIdentityId>>)
    
    { "version": 2 }
    
  4. Desencadene el complemento y compruebe que la adquisición de tokens se realiza correctamente.

  5. Elimine la versión antigua de FIC 1.

Nota:

La versión 0 está en desuso. La compatibilidad con la CLI para generar la versión 2 de FIC se está implementando.

Reference

Obtención del identificador de inquilino codificado

El id. de inquilino codificado es el GUID del inquilino convertido en bytes y codificado como Base64URL (no Base64 estándar):

$tenantId = "<your-tenant-guid>"
$tenantGuid = [System.Guid]::Parse($tenantId)
$tenantBytes = $tenantGuid.ToByteArray()
$base64 = [System.Convert]::ToBase64String($tenantBytes)
$encodedTenantId = $base64.Replace('+', '-').Replace('/', '_').TrimEnd('=')
$encodedTenantId

Generación de un certificado autofirmado

Solo para desarrollo o pruebas:

$params = @{
    Type = 'Custom'
    Subject = 'E=admin@contoso.com,CN=Contoso'
    TextExtension = @(
        '2.5.29.37={text}1.3.6.1.5.5.7.3.4',
        '2.5.29.17={text}email=admin@contoso.com' )
    KeyAlgorithm = 'RSA'
    KeyLength = 2048
    SmimeCapabilities = $true
    CertStoreLocation = 'Cert:\CurrentUser\My'
}
New-SelfSignedCertificate @params

Calcule el certificado autofirmado {hash} (SHA-256 del .cer; expórtelo primero desde un .pfx si es necesario):

CertUtil -hashfile <CertificateFilePath> SHA256

$cert = Get-PfxCertificate -FilePath "path\to\your.pfx"
$cert.RawData | Set-Content -Encoding Byte -Path "extracted.cer"

Entornos especializados en la nube de Azure

Establezca Público, Dirección URL del emisor y Prefijo del asunto explícitamente al implementar fuera de la nube pública, GCC y la fase de primera liberación en GCC.

Nube Público Dirección URL del emisor Prefijo de asunto
GCC High y el Departamento de Defensa api://AzureADTokenExchangeUSGov https://login.microsoftonline.us /eid1/c/usg
Pastel de Luna (China) api://AzureADTokenExchangeChina https://login.partner.microsoftonline.cn /eid1/c/chn
Nacional de EE. UU. (USNAT) api://AzureADTokenExchangeUSNat https://login.microsoftonline.eaglex.ic.gov /eid1/c/uss
Us Secure (USSec) api://AzureADTokenExchangeUSSec https://login.microsoftonline.scloud /eid1/c/usn

Nota:

El valor de Público distingue entre mayúsculas y minúsculas. Para la nube pública, GCC y la primera estación de lanzamiento en GCC, los valores predeterminados son Audience api://AzureADTokenExchange, Issuer https://login.microsoftonline.com, Subject prefix /eid1/c/pub.

Preguntas más frecuentes (FAQ)

¿Cómo puedo resolver AADSTS700213: No se encontró ningún registro de identidad federado coincidente?

El identificador de sujeto calculado en tiempo de ejecución no coincide con ningún FIC de la aplicación. Compruebe lo siguiente:

  1. Configuraste y guardaste el FIC.
  2. El emisor y el asunto coinciden con el formato del paso 3. También puede encontrar el formato esperado en la pila de errores.
  3. El registro version es 2 y FIC usa el formato hash de la versión 2.
  4. El hash se calcula desde la cadena DN del tiempo de ejecución (X509Certificate2.Issuer / X509Certificate2.Subject).
  5. El emisor es https://login.microsoftonline.com/{tenantId}/v2.0 y el destinatario es api://AzureADTokenExchange (distingue entre mayúsculas y minúsculas).

¿Cómo puedo resolver AADSTS70050: la ruta de acceso de la identidad administrada federada no tiene el formato correcto?

El identificador de sujeto contiene caracteres que el proveedor de identidad no acepta; normalmente, caracteres no ASCII en el CN del certificado de la versión 1. La versión 2 genera un identificador de sujeto de solo ASCII y resuelve este error.

¿Cómo se resuelve el error "No se puede alcanzar o establecer conexión a Power Platform"?

Para asegurarse de que los puntos de conexión de Power Platform son accesibles y permitidos, consulte Direcciones URL de Power Platform e intervalos de direcciones IP.