Power Platform 托管标识允许 Dataverse 插件或插件包连接到 Azure 资源,以支持托管标识,而无需凭据。 本文可帮助您在 Power Platform 环境中设置托管标识。
必备条件
- 有权预配用户分配的托管标识(UAMI)或应用程序注册的 Azure 订阅。
- 插件或插件包的工具:
- 集成开发环境 (IDE)(如 Visual Studio)用于构建插件
- 插件注册工具
- SignTool.exe(签名工具)对插件程序集进行签名
- Power Platform CLI
- 用于对插件 程序集进行签名的有效证书。
设置受管身份
若要为 Dataverse 插件或插件包配置 Power Platform 托管标识,请完成以下步骤。
- 创建新的应用程序注册或用户分配的受管身份。
- 配置联合身份凭据。
- 创建和注册 Dataverse 插件或插件包。
请务必生成插件程序集并注册插件或插件包。 - 在 Dataverse 中创建托管标识记录。
- 向应用程序或用户分配的托管标识(UAMI)授予对 Azure 资源的访问权限。
- 验证插件集成。
创建新的应用程序注册或用户分配的受管身份
可以根据以下方案在 Microsoft Entra ID 中创建用户分配的托管标识或应用程序。
- 如果想要与连接到 Azure 资源(如 Azure Key Vault)的插件关联的应用标识,请使用 应用程序注册。 使用应用标识,可以在访问 Azure 资源的插件上应用 Azure 策略。
- 如果希望服务主体访问 Azure 资源(例如 Azure Key Vault),可以预配 用户分配的托管标识。
备注
请务必记下以下 ID,因为您将在后续步骤中使用它们。
- 应用程序(客户端)ID
- 租户 ID
配置联合身份凭据
若要配置托管标识,在您在上一节中创建的 Azure 门户中打开用户分配的托管标识或 Microsoft Entra ID 应用程序。
- 转到 Azure 门户。
- 导航到 Microsoft Entra ID。
- 选择“应用注册”。
- 打开在设置托管标识中创建的应用。
- 导航到证书和密码。
- 选择 “联合凭据 ”选项卡,然后选择“ 添加凭据”。
- 选择“颁发者”作为其他颁发者。
- 输入以下信息:
发行人
使用租户的 v2.0 发行者:
https://login.microsoftonline.com/{tenantID}/v2.0
Example
https://login.microsoftonline.com/5f8a1a9f-2e1a-415f-b10c-84c3736a21b9/v2.0
类型
选择 “显式主题标识符”。
主体标识符
选择与证书类型匹配的格式:
用于开发的自签名证书:
/eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/h/{hash}受信任的颁发者证书(建议用于生产):
/eid1/c/pub/t/{encodedTenantId}/a/qzXoWDkuqUa3l6zM5mM0Rw/n/plugin/e/{environmentId}/i/{issuer}/s/{certificateSubject}
段引用
| 细分市场 | Description |
|---|---|
| eid1 | 标识格式版本 |
| c/pub | 公有云、政府社区云(GCC)的云代码,以及 GCC 中的第一个发布站。 |
| t/{encodedTenantId} | 租户 ID |
| a/qzXoWDkuqUa3l6zM5mM0Rw/ | 仅限内部使用。 请勿修改。 |
| n/plugin | 插件组件 |
| e/{environmentId} | 环境 ID |
| h/{hash} | 证书的 SHA-256 哈希值(仅限自签名) |
| i/{issuer} s/{certificateSubject} |
受信任的颁发者详细信息 |
生成自签名证书
每个插件都必须具有可验证的标识,签名证书充当插件的唯一指纹。 以下代码是一个示例 PowerShell 代码片段,可用于为开发或测试方案生成自签名证书。 可以作为参考,遵循示例 3。
$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
备注
编码 {encodedTenantId}
- 转换 GUID 转为 十六进制。
- 转换十六进制 → Base64URL(而不是标准 Base64)。
自签名哈希
- 基于.cer计算 SHA-256。 如果有 .pfx,请首先导出 .cer :
CertUtil -hashfile <CertificateFilePath> SHA256 $cert = Get-PfxCertificate -FilePath "path o\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 |
| 美国国民(USNAT) | api://AzureADTokenExchangeUSNat |
https://login.microsoftonline.eaglex.ic.gov |
/eid1/c/uss |
| US Secure (USSec) | api://AzureADTokenExchangeUSSec |
https://login.microsoftonline.scloud |
/eid1/c/usn |
备注
受众值区分大小写,必须完全匹配。
对于公有云、GCC 和 GCC 中的第一个发布站(以及其他未列出的云),默认值为:
受众 api://AzureADTokenExchange、签发者 https://login.microsoftonline.com、主题前缀 /eid1/c/pub。
创建和注册 Dataverse 插件或插件包
创建插件组件
使用 Visual Studio 创建插件。 在构建插件时,使用创建新应用程序注册或用户分配的托管身份中的租户 ID 和范围作为组织 URL(如
https://{OrgName}.crm*.dynamics.com/.default或更细粒度的范围)。使用 IManagedIdentityService 并获取令牌方法以请求具有给定作用域的令牌。
方法签名:
string AcquireToken(IEnumerable<string> scopes);
打包和签名
对插件包进行签名
如果要生成插件包,请使用 NuGet 签名 CLI 从 .nuspec 或 .csproj 文件生成包。 生成包后,使用证书对其进行签名。
nuget sign YourPlugin.nupkg `
-CertificatePath MyCert.pfx `
-CertificatePassword "MyPassword" `
-Timestamper http://timestamp.digicert.com
对插件程序集进行签名
如果要注册插件(程序集),请使用 SignTool.exe (签名工具)使用证书对 DLL 进行签名。
signtool sign /f MyCert.pfx /p MyPassword /t http://timestamp.digicert.com /fd SHA256 MyAssembly.dll
可以选择通过提供符合 RFC 3161 的时间戳服务器的 URL 来添加时间戳。
备注
仅出于开发或测试目的使用自签名证书。 请勿在生产环境中使用自签名证书。
注册插件
如果计算机上尚未安装插件注册工具,请安装该工具。 有关详细信息,请参阅 Dataverse 开发工具。
注册插件。 更多信息,请参阅注册插件。
在 Dataverse 中创建托管标识记录
若要在 Dataverse 中预配托管标识记录,请完成以下步骤。
使用 REST 客户端(如 Insomnia)发送 HTTP POST 请求创建托管身份。 使用以下格式来定义 URL 和请求正文。
POST https://<<orgURL>>/api/data/v9.0/managedidentities请务必将 orgURL 替换为组织的 URL。
确保 credentialsource 在有效负载中设置为 2 ,对于特定于环境的方案, subjectscope 设置为 1 , 版本 在有效负载中设置为 1。
示例有效负载
{ "applicationid": "<<appId>>", //Application Id, or ClientId, or User Managed Identity "managedidentityid": "<<anyGuid>>", "credentialsource": 2, // Managed client "subjectscope": 1, //Environment Scope "tenantid": "<<tenantId>>", //Entra Tenant Id "version": 1 }通过发出 HTTP PATCH 请求将其与步骤 1 中创建的托管标识相关联来更新插件包或插件程序集记录。
插件程序集
PATCH https://<<orgURL>>/api/data/v9.0/pluginassemblies(<<PluginAssemblyId>>)插件包
PATCH https://<<orgURL>>/api/data/v9.0/pluginpackages(<<PluginPackageId>>)示例有效负载
{ "managedidentityid@odata.bind": "/managedidentities(<<ManagedIdentityGuid>>)" }请务必将 orgURL、 PluginAssemblyId (或 PluginPackageId)和 ManagedIdentityGuid 替换为你的值。
向应用程序或用户分配的托管标识授予对 Azure 资源的访问权限
如果需要通过应用程序 ID 来访问 Azure 资源(例如 Azure Key Vault),请为应用程序或用户分配的托管标识授予对该资源的访问权限。
验证插件集成
验证您的插件是否可以安全地请求访问支持托管标识的 Azure 资源,从而无需单独的凭据。
常见问题 (FAQ)
如何解决此错误?
如果您收到以下错误:
获取错误 - 配置问题正在阻止身份验证。
AADSTS700213:找不到匹配的联合标识记录
完成以下步骤以解决此问题:
请确保 FIC 已正确配置并保存。
请验证颁发者/主题是否符合之前指定的格式。
还可以在错误堆栈中找到预期的格式。
如何解决“无法访问或连接到 Power Platform”错误?
请参阅 Power Platform 网址和 IP 地址范围,以确保 Power Platform 终结点可以访问并加入白名单。