你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

以编程方式跨 Microsoft Entra 租户创建 MCA 订阅

本文帮助你以编程方式跨 Microsoft Entra 租户创建 Microsoft 客户协议 (MCA) 订阅。 在某些情况下,可能需要跨 Microsoft Entra 租户创建 MCA 订阅,并将这些订阅关联到单个计费帐户。 这种情况的示例包括 SaaS 提供商希望将托管客户服务与内部 IT 服务或需要满足严格监管合规要求的内部环境(例如支付卡行业 (PCI))隔离开来。

创建跨租户的 MCA 订阅的过程实际上是一个两阶段过程。 这需要在源和目标 Microsoft Entra 租户中执行操作。 本文使用了以下术语:

  • 源 Microsoft Entra ID (source.onmicrosoft.com)。 表示 MCA 计费帐户所在的源租户。
  • 目标云 Microsoft Entra ID (destination.onmicrosoft.com)。 表示要在其中创建新 MCA 订阅的目标租户。

无法以编程方式创建支持计划。 可以在 Azure 门户中购买新的支持计划或升级一个。 导航到“帮助 + 支持”,然后在页面顶部选择“选择正确的支持计划”

先决条件

必须已创建好以下租户:

  • 包含有效 Microsoft 客户协议计费帐户的源 Microsoft Entra 租户。 如果你没有有效 MCA,可以创建一个。 有关详细信息,请参阅 Azure - 注册
  • 与 MCA 所属租户不同的目标 Microsoft Entra 租户。 若要创建新的 Microsoft Entra 租户,请参阅 Microsoft Entra 租户设置

应用程序设置

使用以下部分中的信息在源租户和目标租户中设置并配置所需的应用程序。

在源租户中注册应用程序

若要以编程方式创建 MCA 订阅,必须注册一个 Microsoft Entra 应用程序并为其授予适当的 Azure RBAC 权限。 对于此步骤,请确保使用有权注册 Microsoft Entra 应用程序的帐户登录到源租户 (source.onmicrosoft.com)。

按照快速入门:将应用程序注册到 Microsoft 标识平台中的步骤操作。

在此过程中,只需按照注册应用程序添加凭据部分所述进行操作。

保存以下信息以测试并配置环境:

  • 目录(租户)ID
  • 应用程序(客户端)ID
  • 对象 ID
  • 生成的应用机密值。 该值仅在创建时可见。

为源租户中的应用程序创建计费角色分配

查看了解 Azure 中的 Microsoft 客户协议管理角色中的信息,以确定应用程序的适当范围和计费角色

确定范围和角色后,使用在 Azure 门户中管理计费角色中的信息为应用程序创建角色分配。 使用在上一部分注册应用程序时所用的名称搜索该应用程序。

在目标租户中注册应用程序

若要接受来自目标租户 (destination.onmicrosoft.com) 的 MCA 订阅,必须注册一个 Microsoft Entra 应用程序并将其添加到计费管理员 Microsoft Entra 角色。 对于此步骤,请确保使用有权注册 Microsoft Entra 应用程序的帐户登录到目标租户 (destination.onmicrosoft.com)。 该帐户还必须拥有计费管理员角色权限。

按照上面使用的相同步骤在源租户中注册应用程序。 保存以下信息以测试并配置环境:

  • 目录(租户)ID
  • 应用程序(客户端)ID
  • 对象 ID
  • 生成的应用机密值。 该值仅在创建时可见。

将目标应用程序添加到计费管理员 Microsoft Entra 角色

使用为使用 Microsoft Entra ID 的用户分配管理员和非管理员角色中的信息,将在上一部分创建的目标应用程序添加到目标租户中的计费管理员 Microsoft Entra 角色。

以编程方式创建订阅

设置应用程序和权限后,使用以下信息以编程方式创建订阅。

获取目标应用程序服务主体的 ID

在源租户中创建 MCA 订阅时,必须将目标租户中应用程序的服务主体或 SPN 指定为所有者。 使用以下方法之一获取 ID。 在这两种方法中,用于空 GUID 的值是先前创建的目标租户应用程序的应用程序(客户端)ID。

Azure CLI

登录到 Azure CLI 并使用 az ad sp show 命令:

az ad sp show --id aaaaaaaa-bbbb-cccc-1111-222222222222 --query 'id'

Azure PowerShell

登录到 Azure PowerShell 并使用 Get-AzADServicePrincipal cmdlet:

Get-AzADServicePrincipal -ApplicationId 00001111-aaaa-2222-bbbb-3333cccc4444 | Select-Object -Property Id

保存命令返回的 Id 值。

创建订阅

使用以下信息在源租户中创建订阅。

获取源应用程序访问令牌

{{placeholders}} 替换为先前在创建源租户应用程序时保存的实际租户 ID、应用程序(客户端)ID 和应用机密值。

调用请求,并保存响应中的 access_token 值以便在下一步骤中使用。

POST https://login.microsoftonline.com/{{tenant_id}}/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id={{client_id}}&client_secret={{app_secret}}&resource=https%3A%2F%2Fmanagement.azure.com%2F

获取计费帐户、配置文件和发票科目 ID

使用查找你有权访问的计费帐户查找计费对象信息和发票科目以创建订阅部分中的信息获取计费帐户、计费对象信息和发票科目 ID。

注意

我们建议将 REST 方法与先前获取的访问令牌结合使用,以验证是否已在应用程序设置部分成功创建了应用程序计费角色分配。

创建订阅别名

有了计费帐户、配置文件和发票科目 ID,便已获得了创建订阅所需的所有信息:

  • {{guid}}:可以是有效的 GUID。
  • {{access_token}}:先前获取的源租户应用程序访问令牌。
  • {{billing_account}}:先前获取的计费帐户 ID。
  • {{billing_profile}}:先前获取的计费配置文件 ID。
  • {{invoice_section}}:先前获取的发票科目 ID。
  • {{destination_tenant_id}}:先前在创建目标租户应用程序时记下的目标租户 ID。
  • {{destination_service_principal_id}}:先前在获取目标应用程序服务主体的 ID 部分获取的目标租户服务主体 ID。

发送请求并记下响应中 Location 标头的值。

PUT https://management.azure.com/providers/Microsoft.Subscription/aliases/{{guid}}?api-version=2021-10-01
Authorization: Bearer {{access_token}}
Content-Type: application/json

{
  "properties": {
    "displayName": "{{subscription_name}}",
    "workload": "Production",
    "billingScope": "/billingAccounts/{{billing_account}}/billingProfiles/{{billing_profile}}/invoiceSections/{{invoice_section}}",
    "subscriptionId": null,
    "additionalProperties": {
      "managementGroupId": null,
      "subscriptionTenantId": "{{destination_tenant_id}}",
      "subscriptionOwnerId": "{{destination_service_principal_id}}"
    }
  }
}

接受订阅所有权

该过程的最后一个阶段是接受订阅所有权。

获取目标应用程序访问令牌

{{placeholders}} 替换为先前在创建目标租户应用程序时保存的实际租户 ID、应用程序(客户端)ID 和应用机密值。

调用请求,并保存响应中的 access_token 值以便在下一步骤中使用。

POST https://login.microsoftonline.com/{{tenant_id}}/oauth2/token
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id={{client_id}}&client_secret={{app_secret}}&resource=https%3A%2F%2Fmanagement.azure.com%2F

接受所有权

使用以下信息接受目标租户中订阅的所有权:

  • {{subscription_id}}:在创建订阅别名部分创建的订阅 ID。 此 ID 包含在你记下的位置标头中。
  • {{access_token}}:在上一步骤中创建的访问令牌。
  • {{subscription_display_name}}:订阅在 Azure 环境中的显示名称。
POST https://management.azure.com/providers/Microsoft.Subscription/subscriptions/{{subscription_id}}/acceptOwnership?api-version=2021-10-01
Authorization: Bearer {{access_token}}
Content-Type: application/json

{
  "properties": {
    "displayName": "{{subscription_display_name}}",
    "managementGroupId": null
  }
}

后续步骤