Dataverse プラグインまたはプラグイン パッケージの Power Platform マネージド ID を設定する

Power Platform マネージド ID を使用する場合、Dataverse プラグインまたはプラグイン パッケージは、資格情報を管理せずにAzureリソースに接続できます。 この記事では、証明書の完全な識別名 (DN) のハッシュからフェデレーション ID 資格情報 (FIC) を構築する 推奨 (バージョン 2) のセットアップについて説明します。

Note

新規および既存のすべてのプラグインには、Power Platform マネージド ID バージョン 2 を使用します。バージョン 1 (CN ベース) 形式を引き続き使用するプラグインを保守する場合は、「 マネージド ID バージョン 1 のセットアップ」を参照してください。 既存のプラグインをバージョン 2 に移行するには、「 バージョン 2 へのアップグレード」を参照してください。

バージョン 2 の理由

バージョン 2 では、固定長の ASCII のみのサブジェクト識別子が生成されるため、任意の証明書名で動作します。 特定の証明書名(CN)ではバージョン 1 が失敗する:

  • CN の非 ASCII 文字 (アクセント記号付き文字など) → AADSTS70050: The Federated Managed Identity path is not properly formatted
  • CN のコンマ (たとえば、CN=Contoso, Inc.) → AADSTS700213: No matching federated identity record found

前提条件

  • ユーザー割り当てマネージド ID (UAMI) またはアプリケーション登録をプロビジョニングするためのアクセス権を持つAzure サブスクリプション。
  • プラグインまたはプラグイン パッケージ用のツール:
  • プラグイン アセンブリに署名するための有効な証明書。

マネージド ID の設定

  1. 新しいアプリの登録、またはユーザー割り当てマネージド ID を作成します。
  2. プラグインをビルド、署名、および登録します。
  3. フェデレーション ID 資格情報を構成します。
  4. Dataverse でマネージド ID レコードを作成します。
  5. Azure リソースへのアクセス権を付与します。
  6. 統合を検証します。

手順 1: アプリ登録またはユーザー割り当てマネージド ID を作成する

Microsoft Entra IDでユーザー割り当てマネージド ID またはアプリケーションを作成します。

Note

アプリケーション (クライアント) IDテナント ID をキャプチャします。後の手順で使用します。

手順 2: プラグインをビルド、署名、登録する

  1. Visual Studioでプラグインを作成します。 手順 1 のテナント ID と、 https://{OrgName}.crm*.dynamics.com/.defaultなどのスコープを使用します。 IManagedIdentityService を使用してトークンを要求します。

    string AcquireToken(IEnumerable<string> scopes);
    
  2. 証明書を使用してプラグインに署名します。

    プラグイン パッケージ (NuGet):

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

    プラグイン アセンブリ (SignTool):

    signtool sign /f MyCert.pfx /p MyPassword /t http://timestamp.digicert.com /fd SHA256 MyAssembly.dll
    
  3. プラグイン登録ツールを 使用して プラグインを登録します。

Note

自己署名証明書は、開発またはテストにのみ使用します。 運用環境では自己署名証明書を使用しないでください。 証明書を作成するには、「 自己署名証明書を生成する」を参照してください。

手順 3: フェデレーション ID 資格情報を構成する

Azure ポータルで、アプリまたはユーザー割り当てマネージド ID (UAMI) を開き、証明書とシークレット>認証された資格情報>資格情報の追加に移動し、[その他の発行者] を選択します。 次に、次のように入力します。

  • 発行者https://login.microsoftonline.com/{tenantID}/v2.0

  • - 明示的なサブジェクト識別子

  • サブジェクト識別子 — 証明書の種類の形式を使用します。

    • 信頼された発行者証明書 (運用):

      /eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/i/{issuerHash}/s/{subjectHash}
      
    • 自己署名証明書 (開発のみ):

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

    セグメント参照

    区分 Description
    eid1 ID 形式のバージョン
    c/pub パブリック クラウド、GCC、および GCC 内の最初のリリース ステーション向けのクラウド コード
    t/{encodedTenantId} テナント ID。 「エンコードされたテナント ID を取得する」を参照してください
    a/qzXoWDkuqUa3l6zM5mM0Rw/ 内部使用のみ。 変更しない
    n/plugin プラグイン コンポーネント
    e/{environmentId} 環境 ID
    i/{issuerHash} s/{subjectHash} 発行者/サブジェクトの完全な DN に対する SHA-256 Base64URL ハッシュ。 発行者ハッシュとサブジェクト ハッシュの計算を参照してください
    h/{hash} 証明書の SHA-256 (自己署名のみ)

発行者とサブジェクト ハッシュを計算する

証明書に表示される完全な発行者とサブジェクト DN 文字列の SHA-256 ハッシュを取得し、それぞれを URL セーフな Base64 としてエンコードします。 次を使用して DN 文字列を取得します。

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

ハッシュを計算する (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"

または 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('=');
}

出力は、 A-Za-z0-9-、および _のみを含む 43 文字の文字列です。

Important

ランタイムが使用する正確な DN 文字列 (.NET X509Certificate2.Issuer プロパティと X509Certificate2.Subject プロパティ) を使用します。 異なる形式の DN が一致せず、 AADSTS700213で失敗します。

Note

パブリック クラウド以外のデプロイの場合は、クラウド固有の値を設定します。 特殊化されたAzureクラウド環境を参照してください。

手順 4: Dataverse でマネージド ID レコードを作成する

REST クライアントを使用して HTTP POST 要求を送信します。 バージョン 2 の場合は、 version2 に設定します。

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

次に、プラグイン アセンブリ (またはパッケージ) をレコードにバインドします。

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

プラグイン パッケージの場合は、代わりに pluginpackages(<<PluginPackageId>>) を使用します。

手順 5: Azure リソースへのアクセスを許可する

アプリケーションまたはユーザー割り当てマネージド ID に、必要なAzure リソース (Azure Key Vaultなど) へのアクセス権を付与します。

手順 6: 統合を検証する

プラグインをトリガーし、トークンを取得し、別の資格情報なしでAzure リソースに到達します。

バージョン 2 にアップグレードする

バージョン 0 またはバージョン 1 にプラグインがある場合は、プラグインをリビルドまたは再登録することなく、バージョン 2 に移行できます。

オプション 1: Power Platform CLI

Note

CLI マネージド ID 動詞は、Linux ベースのオペレーティング システムやユーザー割り当てマネージド ID (UAMI) では機能しません。 CLI が証明書に対して機能しない場合は、 オプション 2: 手動を使用します。

  1. Power Platform CLI バージョン 2.8.1 以降をインストールします。 Microsoft Power Platform CLI のインストールを参照してください。
  2. 認証プロファイルを作成します。 pac auth create
  3. 現在のバージョンを確認します。 pac managed-identity show-fic --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --version 2
  4. アップグレード: pac managed-identity upgrade-version --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --target-version 2 --confirm
  5. プラグインをトリガーして検証します。

オプション 2: 手動

  1. バージョン 2 の発行者ハッシュとサブジェクト ハッシュを計算します。 発行者ハッシュとサブジェクト ハッシュの計算を参照してください。

  2. バージョン 2 のサブジェクト識別子形式で新しい FIC を追加します (手順 3)。

  3. マネージド ID レコードをバージョン 2 に更新します。

    PATCH https://<<orgURL>>/api/data/v9.0/managedidentities(<<ManagedIdentityId>>)
    
    { "version": 2 }
    
  4. プラグインをトリガーし、トークンの取得が成功したことを確認します。

  5. 古いバージョン 1 FIC を削除します。

Note

バージョン 0 は非推奨です。 バージョン 2 FIC の生成に関する CLI のサポートが進行中です。

Reference

エンコードされたテナント ID を取得する

エンコードされたテナント ID は、テナント GUID がバイトに変換され、 Base64URL としてエンコードされます (標準の Base64 ではありません)。

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

自己署名証明書を生成する

開発またはテストの場合のみ:

$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

自己署名 {hash} を計算します ( .cer経由で SHA-256。必要に応じて最初に .pfx からエクスポートします)。

CertUtil -hashfile <CertificateFilePath> SHA256

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

特殊な Azure クラウド環境

GCC でパブリック クラウド、GCC、および最初のリリース ステーションの外部にデプロイする場合は、 対象ユーザー発行者 URLおよびサブジェクト プレフィックス を明示的に設定します。

観客 発行者 URL 件名プレフィックス
GCC HighとDoD api://AzureADTokenExchangeUSGov https://login.microsoftonline.us /eid1/c/usg
ムーンケーキ (中国) 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

対象者の値は、大文字と小文字を区別します。 GCC のパブリック クラウド、GCC、および最初のリリース ステーションの場合、既定値は Audience api://AzureADTokenExchange、Issuer https://login.microsoftonline.com、Subject prefix /eid1/c/pubです。

よく寄せられる質問 (FAQ)

AADSTS700213を解決する方法: 一致するフェデレーション ID レコードが見つかりません。

実行時に計算されたサブジェクト識別子が、アプリ上の FIC と一致しません。 次の内容を確認する:

  1. FIC を構成して保存しました。
  2. 発行者とサブジェクトは 、手順 3 の形式と一致します。 また、エラー スタックで予期される形式を見つけることもできます。
  3. レコード version2 され、FIC はバージョン 2 ハッシュ形式を使用します。
  4. ハッシュは、ランタイムの DN 文字列 (X509Certificate2.Issuer / X509Certificate2.Subject) から計算されます。
  5. 発行者は https://login.microsoftonline.com/{tenantId}/v2.0、対象者は api://AzureADTokenExchange です (大文字と小文字が区別されます)。

AADSTS70050を解決する方法: フェデレーションマネージド ID のパスが正しく書式設定されていませんか?

サブジェクト識別子には、ID プロバイダーが受け入れない文字 (多くの場合、バージョン 1 の証明書 CN の非 ASCII 文字) が含まれています。 バージョン 2 では、ASCII のみのサブジェクト識別子が生成され、このエラーが解決されます。

"Power Platform にアクセスできない、または Power Platform に接続できない" というエラーを解決するにはどうすればよいですか?

Power Platform エンドポイントが到達可能で許可リストに登録されていることを確認するには、 Power Platform の URL と IP アドレス範囲に関するページを参照してください。