Configurare l'identità gestita di Power Platform per i plug-in Dataverse o i pacchetti plug-in

Quando si usa l'identità gestita di Power Platform, i plug-in dataverse o i pacchetti plug-in possono connettersi alle risorse Azure senza gestire le credenziali. Questo articolo descrive la configurazione consigliata (versione 2), che compila la credenziale dell'identità federata (FIC) da un hash del nome distinto completo (DN) del certificato.

Note

Usare l'identità gestita di Power Platform versione 2 per tutti i plug-in nuovi ed esistenti. Se si mantiene un plug-in che usa ancora il formato basato su CN versione 1, vedere Configurare l'identità gestita versione 1. Per spostare un plug-in esistente alla versione 2, vedere Eseguire l'aggiornamento alla versione 2.

Perché la versione 2

La versione 2 produce un identificatore soggetto a lunghezza fissa, solo ASCII, quindi funziona con qualsiasi nome di certificato. La versione 1 non funziona con alcuni nomi di certificato (CN):

  • I caratteri non ASCII nel cn (ad esempio, lettere accentate) → AADSTS70050: The Federated Managed Identity path is not properly formatted.
  • Le virgole nel cn (ad esempio, CN=Contoso, Inc.) → AADSTS700213: No matching federated identity record found.

Prerequisiti

Configurare l'identità gestita

  1. Creare una nuova registrazione dell'app o una nuova identità gestita assegnata dall'utente.
  2. Compilare, firmare e registrare il plug-in.
  3. Configurare le credenziali dell'identità federata.
  4. Crea il record di identità gestita in Dataverse.
  5. Concedere l'accesso alla risorsa Azure.
  6. Convalidare l'integrazione.

Passaggio 1: Creare una registrazione dell'app o un'identità gestita assegnata dall'utente

Creare un'identità gestita assegnata dall'utente o un'applicazione in Microsoft Entra ID:

Note

Acquisire l'ID applicazione (client) e l'ID tenant , che verranno usati nei passaggi successivi.

Passaggio 2: Compilare, firmare e registrare il plug-in

  1. Crea un plug-in in Visual Studio. Usa l'ID tenant del passaggio 1 e un ambito come https://{OrgName}.crm*.dynamics.com/.default. Usare IManagedIdentityService per richiedere un token:

    string AcquireToken(IEnumerable<string> scopes);
    
  2. Firma il plug-in con il tuo certificato.

    Pacchetto plug-in (NuGet):

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

    Assembly di plug-in (SignTool):

    signtool sign /f MyCert.pfx /p MyPassword /t http://timestamp.digicert.com /fd SHA256 MyAssembly.dll
    
  3. Registrare il plug-in usando lo strumento di registrazione plug-in.

Note

Usare un certificato autofirmato solo per lo sviluppo o il test. Non usare certificati autofirmato nell'ambiente di produzione. Per crearne uno, vedere Generare un certificato autofirmato.

Passaggio 3: Configurare le credenziali dell'identità federata

Nel portale di Azure aprire l'app o l'identità gestita assegnata dall'utente (UAMI), passare a Certificati e segreti>Credenziali> federateAggiungi credenziali e selezionare Altro emittente. Immettere quindi:

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

  • Tipo : identificatore del soggetto esplicito

  • Identificatore del soggetto : usare il formato per il tipo di certificato:

    • Certificato dell'autorità emittente attendibile (produzione):

      /eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/i/{issuerHash}/s/{subjectHash}
      
    • Certificato autofirmato (solo sviluppo):

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

    Riferimento al segmento

    Segmento Description
    eid1 Versione del formato di identità
    c/pub Codice cloud per cloud pubblico, GCC e prima stazione di rilascio in GCC
    t/{encodedTenantId} ID tenant. Vedi Ottenere l'ID del tenant codificato
    a/qzXoWDkuqUa3l6zM5mM0Rw/ Solo per uso interno. Non modificare
    n/plugin Componente plug-in
    e/{environmentId} ID ambiente
    i/{issuerHash} s/{subjectHash} Hash SHA-256 Base64URL del DN completo dell'emittente/del soggetto. Vedi Calcolare gli hash dell'emittente e del soggetto
    h/{hash} SHA-256 del certificato (solo autofirmato)

Calcolare gli hash dell'autorità emittente e dell'oggetto

Calcola l'hash SHA-256 delle stringhe DN complete dell'emittente e del soggetto così come appaiono nel certificato e codifica ciascuna in Base64 sicuro per URL. Ottieni le stringhe DN con:

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

Calcolare gli 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"

Oppure in 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('=');
}

L'output è una stringa di 43 caratteri contenente solo A-Z, a-z, 0-9-, e _.

Importante

Usare la stringa DN esatta utilizzata dal runtime (le proprietà .NET X509Certificate2.Issuer e X509Certificate2.Subject). Un DN con una formattazione diversa non corrisponderà e restituirà un errore con AADSTS700213.

Note

Per le distribuzioni all'esterno del cloud pubblico, impostare valori specifici del cloud. Vedi gli ambienti cloud specializzati di Azure.

Passaggio 4: Creare il record di identità gestita in Dataverse

Inviare una richiesta HTTP POST usando un client REST. Per la versione 2, impostare version su 2.

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

Associa quindi l'assembly plug-in (o il pacchetto) al record:

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

Per un pacchetto plug-in, usare pluginpackages(<<PluginPackageId>>) invece .

Passaggio 5: Concedere l'accesso alla risorsa Azure

Concedere all'applicazione o all'identità gestita assegnata dall'utente l'accesso alla risorsa Azure necessaria, ad esempio Azure Key Vault.

Passaggio 6: Convalidare l'integrazione

Attivare il plug-in e confermare che acquisisce un token e raggiunge la risorsa Azure senza credenziali separate.

Eseguire l'aggiornamento alla versione 2

Se si dispone di un plug-in sulla versione 0 o versione 1, è possibile spostarlo alla versione 2 senza ricompilare o registrare nuovamente il plug-in.

Opzione 1: CLI di Power Platform

Note

I verbi dell'identità gestita dell'interfaccia della riga di comando non funzionano nei sistemi operativi basati su Linux o con l'identità gestita assegnata dall'utente (UAMI). Se l'interfaccia della riga di comando non funziona per il certificato, usare l'opzione 2: Manuale.

  1. Installare Power Platform CLI versione 2.8.1 o successiva. Vedere Installare Microsoft Power Platform CLI.
  2. Creare un profilo di autenticazione: pac auth create
  3. Controllare la versione corrente: pac managed-identity show-fic --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --version 2
  4. Aggiornamento: pac managed-identity upgrade-version --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --target-version 2 --confirm
  5. Attivare il plug-in per la convalida.

Opzione 2: Manuale

  1. Calcolare gli hash versione 2 dell'emittente e del soggetto. Vedere Calcolare gli hash dell'autorità emittente e dell'oggetto.

  2. Aggiungere un nuovo FIC con il formato dell'identificatore del soggetto versione 2 (Passaggio 3).

  3. Aggiornare il record di identità gestita alla versione 2:

    PATCH https://<<orgURL>>/api/data/v9.0/managedidentities(<<ManagedIdentityId>>)
    
    { "version": 2 }
    
  4. Attivare il plug-in e verificare che l'acquisizione del token abbia esito positivo.

  5. Rimuovi la vecchia versione 1 di FIC.

Note

La versione 0 è deprecata. Il supporto CLI per la generazione del FIC versione 2 è in fase di sviluppo.

Reference

Ottieni l'ID del tenant codificato

L'ID tenant codificato è il GUID del tenant convertito in byte e codificato come Base64URL (non 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

Generare un certificato autofirmato

Solo per lo sviluppo o il test:

$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

Calcola il certificato autofirmato {hash} (SHA-256 su .cer; esportalo prima da un .pfx, se necessario):

CertUtil -hashfile <CertificateFilePath> SHA256

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

Ambienti cloud di Azure specializzati

Imposta esplicitamente Destinatario, URL autorità emittente e Prefisso soggetto quando distribuisci al di fuori del cloud pubblico, di GCC e della versione di anteprima in GCC.

Cloud Destinatario URL dell'emittente Prefisso soggetto
GCC High e DoD api://AzureADTokenExchangeUSGov https://login.microsoftonline.us /eid1/c/usg
Mooncake (Cina) 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

Il valore Audience è sensibile alle maiuscole/minuscole. Per il cloud pubblico, GCC e la prima stazione di rilascio in GCC, le impostazioni predefinite sono Audience api://AzureADTokenExchange, Issuer https://login.microsoftonline.com, Subject prefix /eid1/c/pub.

Domande frequenti

Come risolvere AADSTS700213: non è stato trovato alcun record di identità federato corrispondente?

L'identificatore del soggetto calcolato in fase di esecuzione non corrisponde ad alcun FIC nell'app. Verificare che:

  1. La FIC è stata configurata e salvata.
  2. L'autorità emittente e l'oggetto corrispondono al formato nel passaggio 3. È anche possibile trovare il formato previsto nello stack di errori.
  3. Il record version è 2 e il FIC usa il formato hash della versione 2.
  4. L'hash viene calcolato dalla stringa DN del runtime (X509Certificate2.Issuer / X509Certificate2.Subject).
  5. L'emittente è https://login.microsoftonline.com/{tenantId}/v2.0 e il pubblico è api://AzureADTokenExchange (con distinzione tra maiuscole e minuscole).

Come risolvere AADSTS70050: il percorso dell'identità gestita federata non è formattato correttamente?

L'identificatore del soggetto contiene caratteri che il provider di identità non accetta, spesso caratteri non ASCII nel certificato CN nella versione 1. La versione 2 genera un identificatore dell'oggetto composto esclusivamente da caratteri ASCII e risolve questo errore.

Come si risolve l'errore "Impossibile raggiungere o connettersi a Power Platform"?

Per assicurarsi che gli endpoint di Power Platform siano raggiungibili e consentiti, vedere URL di Power Platform e intervalli di indirizzi IP.