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

使用服务主体名称连接不同订阅中的虚拟网络

在某些情况下,无需使用用户帐户或来宾帐户即可连接不同订阅中的虚拟网络。 在此虚拟网络操作说明中,了解如何在不同的订阅中将两个虚拟网络与服务主体名称 (SPN) 对等互连。 不同订阅中的虚拟网络与 Microsoft Entra ID 租户之间的虚拟网络对等互连必须通过 Azure CLI 或 PowerShell 对等互连。 目前,Azure 门户中没有选择将虚拟网络与不同订阅中的 SPN 对等互连。

先决条件

  • 一个 Azure 帐户,其中包含两个活动订阅和两个 Microsoft Entra ID 租户。 免费创建帐户

  • 帐户权限,用于创建服务主体、分配应用权限,并在与每个订阅关联的 Microsoft Entra ID 租户中创建资源。

  • 本操作指南文章需要 2.31.0 版或更高版本的 Azure CLI。 如果使用 Azure Cloud Shell,则最新版本已安装。

使用的资源

SPN 资源组 订阅/租户 虚拟网络 位置
spn-1-peer-vnet test-rg-1 subscription-1 vnet-1 美国东部 2
spn-2-peer-vnet test-rg-2 subscription-2 vnet-2 美国西部 2

创建 subscription-1 资源

  1. 使用 az sign-in,在与 subscription-1 相关联的 Microsoft Entra ID 租户中使用具有创建资源组、虚拟网络和 SPN 权限的用户帐户登录 subscription-1

    az login
    
  2. 使用 az group create 创建资源组。

    az group create \
        --name test-rg-1 \
        --location eastus2  
    
  3. 使用 az network vnet createsubscription-1 中创建名为 vnet-1 的虚拟网络。

    az network vnet create \
        --resource-group test-rg-1 \
        --location eastus2 \
        --name vnet-1 \
        --address-prefixes 10.0.0.0/16 \
        --subnet-name subnet-1 \
        --subnet-prefixes 10.0.0.0/24
    

创建 spn-1-peer-vnet

创建 spn1-peer-vnet,范围限定为上一步中创建的虚拟网络。 在将来的步骤中,此 SPN 将添加到 vnet-2 的范围内,以允许虚拟网络对等互连。

  1. 使用 az network vnet show 将前面创建的虚拟网络的资源 ID 放置在变量中,以便在后面的步骤中使用。

    vnetid=$(az network vnet show \
                --resource-group test-rg-1 \
                --name vnet-1 \
                --query id \
                --output tsv)
    
  2. 使用 az ad sp create-for-rbac 创建 spn-1-peer-vnet,其角色网络参与者范围限定为虚拟网络 vnet-1

    az ad sp create-for-rbac \
        --name spn-1-peer-vnet \
        --role "Network Contributor" \
        --scope $vnetid
    

    记下步骤中创建的输出。 密码仅在此输出中显示。 将密码复制到安全位置,以便在后续登录步骤中使用。

    {
    "appId": "11112222-bbbb-3333-cccc-4444dddd5555",
    "displayName": "spn-1-peer-vnet",
    "password": "",
    "tenant": "aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e"    
    }
    
  3. 服务主体的 appId 在后续步骤中用于完成 SPN 的配置。 使用 az ad sp list 将 SPN 的 appId 放入变量以供以后使用。

    appid1=$(az ad sp list \
                --display-name spn-1-peer-vnet \
                --query [].appId \
                --output tsv)
    
  4. 在上一步中创建的 SPN 必须具有重定向 URI 才能完成身份验证过程审批,并且必须转换为多租户使用。 使用 az ad app updatehttps://www.microsoft.com 添加为重定向 URI,并在 spn-1-peer-vnet 上启用多租户。

    az ad app update \
        --id $appid1 \
        --sign-in-audience AzureADMultipleOrgs \
        --web-redirect-uris https://www.microsoft.com     
    
  5. 服务主体必须具有对目录的 User.Read 权限。 使用 az ad app permission addaz ad app permission grantUser.Read 的 Microsoft Graph 权限添加到服务主体。

    az ad app permission add \
        --id $appid1 \
        --api 00000003-0000-0000-c000-000000000000 \
        --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope
    
    az ad app permission grant \
        --id $appid1 \
        --api 00000003-0000-0000-c000-000000000000 \
        --scope User.Read
    

创建 subscription-2 资源

  1. 使用 az sign-in,在与 subscription-2 相关联的 Microsoft Entra ID 租户中使用具有创建资源组、虚拟网络和 SPN 权限的用户帐户登录 subscription-2

    az login
    
  2. 使用 az group create 创建资源组。

    az group create \
        --name test-rg-2 \
        --location westus2  
    
  3. 使用 az network vnet createsubscription-2 中创建名为 vnet-2 的虚拟网络。

    az network vnet create \
        --resource-group test-rg-2 \
        --location westus2 \
        --name vnet-2 \
        --address-prefixes 10.1.0.0/16 \
        --subnet-name subnet-1 \
        --subnet-prefixes 10.1.0.0/24
    

创建 spn-2-peer-vnet

创建 spn-2-peer-vnet,范围限定为上一步中创建的虚拟网络。 在将来的步骤中,此 SPN 将添加到 vnet-2 的范围内,以允许虚拟网络对等互连。

  1. 使用 az network vnet show 将前面创建的虚拟网络的资源 ID 放置在变量中,以便在后面的步骤中使用。

    vnetid=$(az network vnet show \
                --resource-group test-rg-2 \
                --name vnet-2 \
                --query id \
                --output tsv)
    
  2. 使用 az ad sp create-for-rbac 创建 spn-2-peer-vnet,其角色网络参与者范围限定为虚拟网络 vnet-2

    az ad sp create-for-rbac \
        --name spn-2-peer-vnet \
        --role "Network Contributor" \
        --scope $vnetid
    

    记下步骤中创建的输出。 将密码复制到安全位置,以便在后续登录步骤中使用。 密码不会再次显示。

    输出类似于以下输出。

    {
    "appId": "22223333-cccc-4444-dddd-5555eeee6666",
    "displayName": "spn-2-peer-vnet",
    "password": "",
    "tenant": "bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f"
    }    
    
  3. 服务主体的 appId 在后续步骤中用于完成 SPN 的配置。 使用 az ad sp list 将 SPN 的 ID 放入变量以供以后使用。

    appid2=$(az ad sp list \
                --display-name spn-2-peer-vnet \
                --query [].appId \
                --output tsv)
    
  4. 在上一步中创建的 SPN 必须具有重定向 URI 才能完成身份验证过程审批,并且必须转换为多租户使用。 使用 az ad app updatehttps://www.microsoft.com 添加为重定向 URI,并在 spn-2-peer-vnet 上启用多租户。

    az ad app update \
        --id $appid2 \
        --sign-in-audience AzureADMultipleOrgs \
        --web-redirect-uris https://www.microsoft.com     
    
  5. 服务主体必须具有对目录的 User.Read 权限。 使用 az ad app permission addaz ad app permission grantUser.Read 的 Microsoft Graph 权限添加到服务主体。

    az ad app permission add \
        --id $appid2 \
        --api 00000003-0000-0000-c000-000000000000 \
        --api-permissions e1fe6dd8-ba31-4d61-89e7-88639da4683d=Scope
    
    az ad app permission grant \
        --id $appid2 \
        --api 00000003-0000-0000-c000-000000000000 \
        --scope User.Read
    

在 subscription-1 中注册 spn-2-peer-vnet,并向 vnet-1 分配权限

Microsoft Entra ID 租户中具有管理员权限的用户帐户必须完成将 spn-2-vnet-peer 添加到 subscription-1 的过程。 完成后,可以为 spn-2-vnet-peer 分配 vnet-1 的权限。

在 subscription-1 中注册 spn-2-peer-vnet 应用

subscription-1 Microsoft Entra ID 租户中的管理员必须批准服务主体 spn-2-peer-vnet,以便可以将其添加到虚拟网络 vnet-1。 使用以下命令登录到 subscription-2,以查找 spn-2-peer-vnet的 appID。

  1. 使用 az login 登录到 subscription-2

    az login
    
  2. 使用 az ad sp list 获取 spn-2-peer-vnet 的 appId。 记下输出中的 appID。 此 appID 将在后续步骤的身份验证 URL 中使用。

    appid2=$(az ad sp list \
                --display-name spn-2-peer-vnet \
                --query [].appId \
                --output tsv)
    echo $appid2
    
  3. 使用 spn-2-peer-vnet 的 appid 和 subscription-1 的 Microsoft Entra ID 租户 ID 生成用于审批的登录 URL。 URL 基于以下示例生成:

    https://login.microsoftonline.com/entra-tenant-id-subscription-1/oauth2/authorize?client_id={$appid2}&response_type=code&redirect_uri=https://www.microsoft.com
    

    URL 类似于以下示例。

    https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/oauth2/authorize?client_id=22223333-cccc-4444-dddd-5555eeee6666&response_type=code&redirect_uri=https://www.microsoft.com
    
  4. 在 Web 浏览器中打开 URL,并在 subscription-1 中的 Microsoft Entra ID 租户中以管理员帐户登录。

  5. 批准应用程序 spn-2-peer-vnet。 microsoft.com 主页显示身份验证是否成功。

将 spn-2-peer-vnet 分配到 vnet-1

管理员批准 spn-2-peer-vnet 后,将其作为网络参与者添加到虚拟网络 vnet-1

  1. 使用 az login 登录到 subscription-1

    az login
    
  2. 使用 az ad sp list 查找适用于 spn-2-peer-vnet 的 appId,并将其置于变量中供以后使用。

    appid2=$(az ad sp list \
                --display-name spn-2-peer-vnet \
                --query [].appId \
                --output tsv)
    
  3. 使用 az network vnet show 获取 vnet-1 的资源 ID,以便在后续步骤中使用。

    vnetid=$(az network vnet show \
                --resource-group test-rg-1 \
                --name vnet-1 \
                --query id \
                --output tsv)
    
  4. 使用 az role assignment create 以下命令将 spn-2-peer-vnet 添加到 vnet-1 作为网络参与者

    az role assignment create --assignee $appid2 \
        --role "Network Contributor" \
        --scope $vnetid
    

在 subscription-2 中注册 spn-1-peer-vnet,并向 vnet-2 分配权限

Microsoft Entra ID 租户中具有管理员权限的用户帐户必须完成将 spn-1-peer-vnet 添加到 subscription-2 的过程。 完成后,可以为 spn-1-peer-vnet 分配 vnet-2 的权限。

在 subscription-2 中注册 spn-1-peer-vnet 应用

subscription-2 Microsoft Entra ID 租户中的管理员必须批准服务主体 spn-1-peer-vnet,以便将其添加到虚拟网络 vnet-2。 使用以下命令登录到 subscription-1,查找 spn-1-peer-vnet 的 appID。

  1. 使用 az login 登录到 subscription-1

    az login
    
  2. 使用 az ad sp list 获取 spn-1-peer-vnet 的 appId。 记下输出中的 appID。 此 appID 将在后续步骤的身份验证 URL 中使用。

    appid1=$(az ad sp list \
                --display-name spn-1-peer-vnet \
                --query [].appId \
                --output tsv)
    echo $appid1
    
  3. 使用 spn-1-peer-vnet 的 appid 和 subscription-2 的 Microsoft Entra ID 租户 ID 生成用于审批的登录 URL。 URL 基于以下示例生成:

    https://login.microsoftonline.com/entra-tenant-id-subscription-2/oauth2/authorize?client_id={$appid1}&response_type=code&redirect_uri=https://www.microsoft.com
    

    URL 类似于以下示例。

    https://login.microsoftonline.com/bbbbcccc-1111-dddd-2222-eeee3333ffff/oauth2/authorize?client_id=11112222-bbbb-3333-cccc-4444dddd5555&response_type=code&redirect_uri=https://www.microsoft.com
    
  4. 在 Web 浏览器中打开 URL,并在 subscription-2 中的 Microsoft Entra ID 租户中以管理员帐户登录。

  5. 批准应用程序 spn-1-peer-vnet。 microsoft.com 主页显示身份验证是否成功。

将 spn-1-peer-vnet 分配到 vnet-2

管理员批准 spn-1-peer-vnet 后,将其作为网络参与者添加到虚拟网络 vnet-2

  1. 使用 az login 登录到 subscription-2

    az login
    
  2. 使用 az ad sp list 查找适用于 spn-1-peer-vnet 的 appId,并将其置于变量中供以后使用。

    appid1=$(az ad sp list \
                --display-name spn-1-peer-vnet \
                --query [].appId \
                --output tsv)
    
  3. 使用 az network vnet show 获取 vnet-2 的资源 ID,以便在后续步骤中使用。

    vnetid=$(az network vnet show \
                --resource-group test-rg-2 \
                --name vnet-2 \
                --query id \
                --output tsv)
    
  4. 使用 az role assignment createspn-1-peer-vnet 添加到 vnet-2 作为网络参与者

    az role assignment create --assignee $appid1 \
        --role "Network Contributor" \
        --scope $vnetid
    

将 vnet-1 对等互连到 vnet-2,将 vnet-2 对等互连到 vnet-1

若要将 vnet-1 对等互连到 vnet-2,请使用服务主体 appId 和密码登录到与 subscription-1 关联的 Microsoft Entra ID 租户。

获取 spn-1-peer-vnet 和 spn-2-peer-vnet 的 appId

在本文中,请登录到每个订阅,并获取每个 SPN 的 appID 以及每个虚拟网络的资源 ID。 使用这些值在后续步骤中使用 SPN 登录到每个订阅。 如果双方已有 SPN 的 appID 和虚拟网络的资源 ID,则不需要执行这些步骤即可对等互连虚拟网络。

  1. 使用 az login 使用常规用户帐户登录到 subscription-1

    az login
    
  2. 使用 az network vnet show 获取 vnet-1 的资源 ID,以便在后续步骤中使用。

    vnetid1=$(az network vnet show \
                --resource-group test-rg-1 \
                --name vnet-1 \
                --query id \
                --output tsv)
    
  3. 使用 az ad sp list 获取 spn-1-peer-vnet 的 appId,并将其置于变量中,以便在后续步骤中使用。

    appid1=$(az ad sp list \
                --display-name spn-1-peer-vnet \
                --query [].appId \
                --output tsv)
    
  4. 使用 az login 使用常规用户帐户登录到 subscription-2

    az login
    
  5. 使用 az network vnet show 获取 vnet-2 的资源 ID,以便在后续步骤中使用。

    vnetid2=$(az network vnet show \
                --resource-group test-rg-2 \
                --name vnet-2 \
                --query id \
                --output tsv)
    
  6. 使用 az ad sp list 获取 spn-2-peer-vnet 的 appId,并将其置于变量中,以便在后续步骤中使用。

    appid2=$(az ad sp list \
                --display-name spn-2-peer-vnet \
                --query [].appId \
                --output tsv)
    echo $appid2
    
  7. 使用 az logout 通过以下命令注销 Azure CLI 会话。 不要关闭终端

    az logout
    

对等互连虚拟网络

  1. 使用 az login 通过 spn-1-peer-vnet 登录到 subscription-1。 需要与 subscription-1 关联的 Microsoft Entra ID 租户的租户 ID 来完成命令。 该密码以变量占位符显示在示例中。 替换为在创建资源期间记录的密码。 将 --tenant 中的占位符替换为与 subscription-1 关联的 Microsoft Entra ID 租户的租户 ID。

    az login \
        --service-principal \
        --username $appid1 \
        --password $password \
        --tenant aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
    
  2. 使用 az login 通过 spn-2-peer-vnet 登录到 subscription-2。 需要与 subscription-2 关联的 Microsoft Entra ID 租户的租户 ID 才能完成命令。 该密码以变量占位符显示在示例中。 替换为在创建资源期间记录的密码。 将 --tenant 中的占位符替换为与 subscription-2 关联的 Microsoft Entra ID 租户的租户 ID。

    az login \
        --service-principal \
        --username $appid2 \
        --password $password \
        --tenant bbbb1b1b-cc2c-dd3d-ee4e-ffffff5f5f5f
    
  3. 使用 az account set 将上下文更改为 subscription-1

    az account set --subscription "subscription-1-subscription-id-NOT-ENTRA-TENANT-ID"
    
  4. 使用 az network vnet peering createvnet-1vnet-2 之间创建虚拟网络对等互连。

    az network vnet peering create \
        --name vnet-1-to-vnet-2 \
        --resource-group test-rg-1 \
        --vnet-name vnet-1 \
        --remote-vnet $vnetid2 \
        --allow-vnet-access
    
  5. 使用 az network vnet peering list 验证 vnet-1vnet-2之间的虚拟网络对等互连。

    az network vnet peering list \
        --resource-group test-rg-1 \
        --vnet-name vnet-1 \
        --output table
    
  6. 使用 az account set 将上下文更改为 subscription-2

    az account set --subscription "subscription-2-subscription-id-NOT-ENTRA-TENANT-ID"
    
  7. 使用 az network vnet peering createvnet-2vnet-1 之间创建虚拟网络对等互连。

    az network vnet peering create \
        --name vnet-2-to-vnet-1 \
        --resource-group test-rg-2 \
        --vnet-name vnet-2 \
        --remote-vnet $vnetid1 \
        --allow-vnet-access
    
  8. 使用 az network vnet peering list 验证 vnet-2vnet-1 之间的虚拟网络对等互连。

    az network vnet peering list \
        --resource-group test-rg-2 \
        --vnet-name vnet-2 \
        --output table