當你使用 Power Platform 管理身份時,Dataverse 外掛或外掛套件可以在不管理憑證的情況下連接到 Azure 資源。 本文說明 推薦的(版本2) 設定,該架構從憑證完整識別名稱(DN)的雜湊值中建立聯邦身份憑證(FIC)。
備註
所有新建及現有外掛都請使用 Power Platform 管理身份版本 2。如果你維護的外掛仍使用版本 1(基於 CN)格式,請參考 設定管理身份版本 1。 若要將現有外掛移至 版本 2,請參見 升級至 version 2。
為什麼選擇版本 2
版本 2 產生固定長度、僅支援 ASCII 的主體識別碼,因此可使用任何憑證名稱。 版本 1 在某些憑證名稱(CN)上失敗:
- CN 中的非 ASCII 字元(例如帶重音符號的字母)→
AADSTS70050: The Federated Managed Identity path is not properly formatted。 - CN 中的逗號(例如,
CN=Contoso, Inc.)→AADSTS700213: No matching federated identity record found。
先決條件
- 有權佈建使用者指派的受控識別 (UAMI) 或應用程式註冊的 Azure 訂閱。
- 外掛工具或外掛套件:
- 整合開發環境(IDE),類似 Visual Studio,用於建置外掛
- 外掛程式註冊工具
- SignTool.exe (簽署工具) ,用於對外掛程式集進行簽署
- Power Platform CLI
- 用於簽署外掛程式組件的有效憑證。
設定受控身分識別
- 建立新的應用程式註冊或使用者指派的受控識別。
- 建立、簽名並註冊外掛。
- 設定聯邦身份憑證。
- 在 Dataverse 建立管理身份記錄。
- 授予 Azure 資源的存取權限。
- 驗證整合。
步驟 1:建立應用程式註冊或使用者指派的管理身份
在 Microsoft Entra ID 中建立使用者指派的受控識別或應用程式:
- 對於與外掛相關的應用程式身份(以便套用 Azure 政策),請使用 Application registration。
- 為服務主體佈建使用者指派的受控識別。
備註
擷取 應用程式(客戶端)ID 和 租戶 ID ——這些會在後續步驟中使用。
步驟 2:建立、簽名並註冊外掛
在 Visual Studio 建立一個外掛。 使用步驟 1 中的租用戶識別碼以及像
https://{OrgName}.crm*.dynamics.com/.default這樣的範圍。 使用 IManagedIdentityService 來請求一個令牌:string AcquireToken(IEnumerable<string> scopes);用你的憑證簽署外掛程式。
外掛套件(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:設定聯邦身份憑證
在 Azure 入口網站中,開啟您的應用程式或使用者指派管理身份(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}
區段參考
區段 說明 eid1身份格式版本 c/pub公有雲、GCC 及 GCC 首個發佈站的雲端程式碼 t/{encodedTenantId}租戶 ID. 請參閱 取得編碼租戶ID a/qzXoWDkuqUa3l6zM5mM0Rw/僅供內部使用。 不要修改 n/plugin外掛元件 e/{environmentId}環境識別碼 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('=');
}
輸出是一個 43 個字元的字串,且僅包含 A-Z、a-z、0-9、- 和 _。
Important
使用執行時使用的精確 DN 字串(.NET X509Certificate2.Issuer 和X509Certificate2.Subject屬性)。 格式不同的 DN 無法比對相符,並會因 AADSTS700213 錯誤而失敗。
備註
對於公共雲以外的部署,請設定雲端專屬值。 請參閱專門化的 Azure 雲端環境。
步驟 4:在 Dataverse 建立受管理身份記錄
透過 REST 用戶端發送 HTTP POST 請求。 版本 2 則設 version 為 2。
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 資源
授予應用程式或使用者指派的管理身份存取權,存取它所需的 Azure 資源,例如 Azure Key Vault。
步驟 6:驗證整合
觸發外掛並確認它取得令牌並存取 Azure 資源,無需獨立憑證。
升級至版本 2
如果你有版本 0 或版本 1 的外掛,可以直接移到 版本 2,而不必重建或重新註冊該外掛。
選項一:Power Platform CLI
備註
CLI 的受控識別命令不適用於 Linux 型作業系統,也不支援使用者指派的受控識別 (UAMI)。 如果 CLI 對你的憑證不適用,請使用 選項二:手動。
- 安裝 Power Platform CLI 2.8.1 或更新版本。 請參見安裝 Microsoft Power Platform CLI。
- 建立驗證設定檔:
pac auth create - 請查看目前版本:
pac managed-identity show-fic --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --version 2 - 升級:
pac managed-identity upgrade-version --environment <orgUrl> --component-type PluginAssembly --component-id <pluginAssemblyId> --target-version 2 --confirm - 觸發外掛來驗證。
選項 2:手動
計算第 2 版簽發者與主體雜湊。 請參閱 計算簽發者和主體雜湊值。
新增一個採用第 2 版主體識別碼格式的 FIC(步驟 3)。
將管理身份記錄更新為版本 2:
PATCH https://<<orgURL>>/api/data/v9.0/managedidentities(<<ManagedIdentityId>>){ "version": 2 }觸發外掛程式,並確認是否成功取得權杖。
移除舊版的第 1 版 FIC。
備註
版本 0 已被棄用。 目前正在進行 CLI 支援以產生第 2 版 FIC。
參考
取得編碼的租戶 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 首個發佈站外時,請明確設定 受眾、 發行者網址及 主題前綴 。
| 雲端 | 對象 | 簽發者網址 | 主題前綴 |
|---|---|---|---|
| GCC High 和 DoD | api://AzureADTokenExchangeUSGov |
https://login.microsoftonline.us |
/eid1/c/usg |
| 月餅(中國) | api://AzureADTokenExchangeChina |
https://login.partner.microsoftonline.cn |
/eid1/c/chn |
| 美國國民 (USNAT) | api://AzureADTokenExchangeUSNat |
https://login.microsoftonline.eaglex.ic.gov |
/eid1/c/uss |
| 美國安全 (USSec) | api://AzureADTokenExchangeUSSec |
https://login.microsoftonline.scloud |
/eid1/c/usn |
備註
Audience 的值會區分大小寫。 對於公有雲、GCC 以及 GCC 中的第一個發佈站,預設為 Audience api://AzureADTokenExchange、Issuer https://login.microsoftonline.com、Subject 前綴 /eid1/c/pub。
常見問題集 (FAQ)
我該如何解決AADSTS700213:找不到匹配的聯邦身份紀錄?
執行時計算的主題識別碼與應用程式中的任何 FIC 都不匹配。 請確定:
- 你已經設定並儲存了 FIC。
- 簽發者與主體的格式與 Step 3 相符。 您也可以在錯誤堆疊中找到預期的格式。
- 記錄
version為2,且 FIC 使用第 2 版雜湊格式。 - 雜湊值是根據執行時的 DN 字串(
X509Certificate2.Issuer/X509Certificate2.Subject)計算而得。 - 發行人是,
https://login.microsoftonline.com/{tenantId}/v2.0受眾是api://AzureADTokenExchange(大小寫區分)。
如何解決 AADSTS70050:同盟式受控識別路徑的格式不正確?
主體識別碼包含身分提供者不接受的字元——最常見的是第 1 版憑證的 CN 中含有非 ASCII 字元。 版本 2 產生僅 ASCII 的主體識別碼並解決此錯誤。
如何解決「無法連線或連線到 Power Platform」錯誤?
為確保 Power Platform 端點可被存取並列入允許名單,請參閱 Power Platform 網址與 IP 位址範圍。