Configurer l’identité managée Power Platform pour les plug-ins Dataverse ou les packages de plug-in

Lorsque vous utilisez l’identité managée Power Platform, les plug-ins Dataverse ou les packages de plug-ins peuvent se connecter à des ressources Azure sans gérer les informations d’identification. Cet article décrit la configuration recommandée (version 2), qui génère les informations d’identification d’identité fédérée (FIC) à partir d’un hachage du nom unique complet (DN) du certificat.

Note

Utilisez l’identité managée Power Platform version 2 pour tous les plug-ins nouveaux et existants. Si vous conservez un plug-in qui utilise toujours le format version 1 (cn), consultez Configurer l’identité managée version 1. Pour déplacer un plug-in existant vers la version 2, consultez Mettre à niveau vers la version 2.

Pourquoi la version 2

La version 2 produit un identificateur d’objet ASCII de longueur fixe. Il fonctionne donc avec n’importe quel nom de certificat. La version 1 échoue sur certains noms de certificats (CN) :

  • Caractères non ASCII dans le CN (par exemple, lettres accentuées) → AADSTS70050: The Federated Managed Identity path is not properly formatted.
  • Virgules dans le CN (par exemple, CN=Contoso, Inc.) → AADSTS700213: No matching federated identity record found.

Prerequisites

  • Un abonnement Azure avec accès pour provisionner l’identité managée affectée par l’utilisateur (UAMI) ou l’enregistrement d’application.
  • Outils pour les plug-ins ou les packages de plug-ins :
  • Certificat valide pour signer l'assemblage du plug-in.

Configurer une identité managée

  1. Créez un enregistrement d’application ou une identité managée attribuée par l’utilisateur.
  2. Compilez, signez et enregistrez le plug-in.
  3. Configurez l’identifiant d’identité fédérée.
  4. Créez l’enregistrement d’identité managée dans Dataverse.
  5. Accordez l’accès à la ressource Azure.
  6. Validez l’intégration.

Étape 1 : Créer une inscription d’application ou une identité managée affectée par l’utilisateur

Créez une identité managée affectée par l’utilisateur ou une application dans Microsoft Entra ID :

Note

Capturez l’ID d’application (client) et l’ID de locataire . Vous les utilisez dans les étapes ultérieures.

Étape 2 : Générer, signer et inscrire le plug-in

  1. Créez un plug-in Visual Studio. Utilisez l’ID du locataire de l’étape 1 et un scope comme https://{OrgName}.crm*.dynamics.com/.default. Utilisez IManagedIdentityService pour demander un jeton :

    string AcquireToken(IEnumerable<string> scopes);
    
  2. Connectez le plug-in avec votre certificat.

    Package de plug-in (NuGet) :

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

    Assemblage du module d’extension (SignTool) :

    signtool sign /f MyCert.pfx /p MyPassword /t http://timestamp.digicert.com /fd SHA256 MyAssembly.dll
    
  3. Enregistrez le module externe à l’aide de l’outil d’enregistrement du module externe.

Note

Utilisez un certificat auto-signé uniquement pour le développement ou le test. N’utilisez pas de certificats auto-signés en production. Pour en créer un, consultez Générer un certificat auto-signé.

Étape 3 : Configurer les informations d’identification de l’identité fédérée

Dans le portail Azure, ouvrez votre application ou l’identité managée affectée par l’utilisateur (UAMI), accédez à Certificats et secrets> Desinformations d’identification fédérées Ajouter des>informations d’identification, puis sélectionnez Autre émetteur. Entrez ensuite :

  • Émetteurhttps://login.microsoftonline.com/{tenantID}/v2.0

  • TypeIdentificateur d’objet explicite

  • Identificateur de l’objet : utilisez le format de votre type de certificat :

    • Certificat d’émetteur de confiance (production) :

      /eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/i/{issuerHash}/s/{subjectHash}
      
    • Certificat auto-signé (développement uniquement) :

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

    Référence de segment

    Segment Description
    eid1 Version du format d’identité
    c/pub Code cloud pour le cloud public, le cloud de la communauté du secteur public (GCC) et la station de première publication dans GCC
    t/{encodedTenantId} ID de locataire. Voir Obtenir l’ID de locataire encodé
    a/qzXoWDkuqUa3l6zM5mM0Rw/ Utilisation interne uniquement. Ne modifiez pas
    n/plugin Composant de module d'extension
    e/{environmentId} ID environnement
    i/{issuerHash} s/{subjectHash} Hachage SHA-256 Base64URL du DN complet de l’émetteur/du sujet. Voir Calculer les hachages de l’émetteur et du sujet
    h/{hash} SHA-256 du certificat (auto-signé uniquement)

Calculer les hachages de l’émetteur et du sujet

Prenez le hachage SHA-256 de l’émetteur complet et des chaînes DN d’objet telles qu’elles apparaissent sur le certificat et encodez-les sous forme d’URL-safe Base64. Obtenez les chaînes DN avec :

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

Calculez les hachages (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"

Ou 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 sortie est une chaîne de 43 caractères contenant uniquement A-Z, , a-z0-9, -et _.

Important

Utilisez la chaîne DN exacte utilisée par l’environnement d’exécution (les propriétés .NET X509Certificate2.Issuer et X509Certificate2.Subject). Un nom de domaine au format différent ne correspond pas et échoue avec AADSTS700213.

Note

Pour les déploiements en dehors du cloud public, définissez des valeurs spécifiques au cloud. Consultez les environnements cloud Azure spécialisés.

Étape 4 : Créer l’enregistrement d’identité managée dans Dataverse

Envoyez une requête HTTP POST à l’aide d’un client REST. Pour la version 2, définissez version sur 2.

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

Ensuite, liez l’assembly de plug-in (ou package) à l’enregistrement :

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

Pour un package de plug-in, utilisez pluginpackages(<<PluginPackageId>>) plutôt.

Étape 5 : Accorder l’accès à la ressource Azure

Accordez à l’application ou à l’identité managée affectée par l’utilisateur l’accès à la ressource Azure dont elle a besoin, par exemple Azure Key Vault.

Étape 6 : Valider l’intégration

Déclenchez le plug-in et confirmez qu’il acquiert un jeton et atteint la ressource Azure sans informations d’identification distinctes.

Mettre à niveau vers la version 2

Si vous disposez d’un plug-in sur la version 0 ou la version 1, vous pouvez le déplacer vers la version 2 sans regénérer ou réinscrire le plug-in.

Option 1 : Power Platform CLI

Note

Les commandes CLI relatives aux identités managées ne fonctionnent pas sur les systèmes d’exploitation Linux ni avec les identités managées affectées par l’utilisateur (UAMI). Si l’interface CLI ne fonctionne pas pour votre certificat, utilisez l’option 2 : Manuel.

  1. Installez Power Platform CLI version 2.8.1 ou ultérieure. Consultez Installer Microsoft Power Platform CLI.
  2. Créez un profil d’authentification : pac auth create
  3. Vérifiez la version actuelle : pac managed-identity show-fic --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --version 2
  4. Mettre à niveau : pac managed-identity upgrade-version --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --target-version 2 --confirm
  5. Déclenchez le plug-in pour valider.

Option 2 : Manuel

  1. Calculer les hachages de l’émetteur et du sujet en version 2. Voir Calculer les hachages de l’émetteur et du sujet.

  2. Ajoutez un nouveau FIC au format d’identificateur d’objet version 2 (étape 3).

  3. Mettez à jour l’enregistrement d’identité managée vers la version 2 :

    PATCH https://<<orgURL>>/api/data/v9.0/managedidentities(<<ManagedIdentityId>>)
    
    { "version": 2 }
    
  4. Déclenchez le plug-in et vérifiez que l’acquisition de jeton réussit.

  5. Supprimez l’ancienne version 1 FIC.

Note

La version 0 est déconseillée. La prise en charge en ligne de commande pour générer le FIC version 2 est en cours de développement.

Reference

Obtenir l’ID de locataire encodé

L’ID de locataire encodé est le GUID du locataire converti en octets et encodé en base64URL (et non en base64 standard) :

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

Générer un certificat auto-signé

Pour le développement ou les tests uniquement :

$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

Calculez le certificat auto-signé {hash} (SHA-256 du .cer ; exportez-le d’abord depuis un .pfx, si nécessaire) :

CertUtil -hashfile <CertificateFilePath> SHA256

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

Environnements cloud Azure spécialisés

Définissez l’audience, l’URL de l’émetteur et le préfixe Objet explicitement lors du déploiement en dehors du cloud public, du GCC et de la première station de publication dans GCC.

Cloud Audience URL de l’émetteur Préfixe de l’objet
GCC High et DoD api://AzureADTokenExchangeUSGov https://login.microsoftonline.us /eid1/c/usg
Mooncake (Chine) api://AzureADTokenExchangeChina https://login.partner.microsoftonline.cn /eid1/c/chn
US National (USNAT) api://AzureADTokenExchangeUSNat https://login.microsoftonline.eaglex.ic.gov /eid1/c/uss
US Secure (USSec) api://AzureADTokenExchangeUSSec https://login.microsoftonline.scloud /eid1/c/usn

Note

La valeur Audience respecte la casse. Pour le cloud public, le cloud de la communauté du secteur public (GCC) et la station de première publication dans GCC, les valeurs par défaut sont Audience api://AzureADTokenExchange, Émetteur https://login.microsoftonline.com, Préfixe d’objet /eid1/c/pub.

Questions Fréquemment Posées (FAQ)

Comment résoudre AADSTS700213 : aucun enregistrement d’identité fédérée correspondant trouvé ?

L’identificateur de l’objet calculé au moment de l’exécution ne correspond à aucun FIC sur l’application. Vérifiez les éléments suivants :

  1. Vous avez configuré et enregistré le FIC.
  2. L’émetteur et l’objet correspondent au format de l’étape 3. Vous pouvez également trouver le format attendu dans la pile d’erreurs.
  3. L’enregistrement version est 2 et le FIC utilise le format de hachage version 2.
  4. Le hachage est calculé à partir de la chaîne DN du runtime (X509Certificate2.Issuer / X509Certificate2.Subject).
  5. L’émetteur est https://login.microsoftonline.com/{tenantId}/v2.0 et l’audience est api://AzureADTokenExchange (sensible à la casse).

Comment résoudre AADSTS70050 : le chemin d’accès de l’identité managée fédérée n’est pas correctement mis en forme ?

L’identificateur de l’objet contient des caractères que le fournisseur d’identité n’accepte pas , le plus souvent des caractères non ASCII dans le certificat CN sous la version 1. La version 2 génère un identificateur d’objet ASCII uniquement et résout cette erreur.

Comment résoudre l’erreur « Impossible d’atteindre ou de se connecter à Power Platform » ?

Consultez URL Power Platform et plages d’adresses IP pour vous assurer que les points de terminaison Power Platform sont accessibles et autorisés.