如何从不同的 AAD 租户获取管理组和订阅?

Posted

技术标签:

【中文标题】如何从不同的 AAD 租户获取管理组和订阅?【英文标题】:How to get management groups and subscriptions from different AAD tenant? 【发布时间】:2020-11-13 00:42:50 【问题描述】:

天蓝色

我的帐户中有两个 AAD(Azure Active Directory)。

第一个 AAD 中的实体:['Tenant Root Group', 'group A', 'subGroup B', 'Microsoft Partner Network', 'subscription 2']

第二个 AAD 中的实体:['Tenant Root Group', 'subscription 3']

Python

我正在尝试使用 python azure SDK 根据directory 获取management groupssubscriptions

下面的代码可以列出第一个目录中的实体,但第二个目录中的其他实体没有按我的预期列出。

有谁知道如何获取两个目录中的所有实体?

代码

from azure.mgmt.managementgroups import ManagementGroupsAPI
from msrestazure.azure_active_directory import UserPassCredentials


def get_entities(credentials):
    mgmt_groups_api = ManagementGroupsAPI(credentials)
    entities = mgmt_groups_api.entities.list()
    entity_infos = [entity for entity in entities]
    entity_names = [entity.display_name for entity in entity_infos]
    print(entity_names)


def main():
    credentials = UserPassCredentials(
        'account',
        'password',
    )
    get_entities(credentials)


if __name__ == '__main__':
    main()

输出

['Group A', 'subGroup B', 'subGroup C', 'subscription 1', 'subscription 2']

【问题讨论】:

我不熟悉 Python API,但您基本上需要为凭证对象指定 AAD 租户 ID,以便它针对正确的租户进行身份验证。您需要执行该过程两次,每个目录一次。 嗨@juunas,我正在使用上面的UserPassCredential。但就像你说的,如果我能有一个租户 ID 列表,然后改变获取凭证的方式。之后,反复为每个目录获取实体,然后我可以得到我需要的东西。我认为问题变成了“如何获取 AAD 租户 ID 列表”,我将调查如何做到这一点。谢谢你的回复???? 【参考方案1】:

我认为@juunas 的评论是正确的,您需要在使用凭证时指定租户。

我认为问题变成了“如何获取 AAD 租户 ID 列表”

您可以使用此 REST API - Tenants - List 来获取您帐户的租户。

GET https://management.azure.com/tenants?api-version=2020-01-01

获取租户ID后,在用户凭证中指定租户,确保您使用的是没有MFA的工作帐户(组织帐户,而不是个人帐户),用户凭证使用ROPC flow,不能与个人帐户一起使用.

【讨论】:

嗨@Joy Wang,感谢您的回复。我发现 Azure SDK for Python 提供了一种列出我帐户中所有租户的方法。稍后我会发布我的代码。 Azure SDK for Python - SubscriptionClient @someone 这也对,重点是需要列出不同租户的管理组。 sdk调用Management Groups - List api,它将列出管理组取决于您提供的令牌(令牌将在其cliiaim中包含租户ID),即用户凭证,代码使用凭证获取令牌。跨度> 【参考方案2】:

感谢@juunas 指出这个问题真正需要什么,@Joy Wang 提供了一个 API 解决方案来按帐户获取租户列表。

API解决方案

再次感谢@juunas,通过使用Tenants - List API,我们可以轻松列出租户。 (更多详情请查看his answer。)

我认为这是解决这个问题的一个很好的通用方法。

Azure SDK for Python 解决方案

幸运的是,我发现Azure SDK for Python 提供了SubscriptionClient,它允许我以编程方式列出租户。

这就是我在 Python 中列出租户的方式:

def get_tenants() -> [TenantIdDescription]:
    credentials = UserPassCredentials(
        'account',
        'password',
    )
    sub_client = SubscriptionClient(credentials)
    tenants = sub_client.tenants.list()
    return tenants

将SubscriptionClient组合成源代码

from azure.mgmt.managementgroups import ManagementGroupsAPI
from azure.mgmt.resource import SubscriptionClient
from msrestazure.azure_active_directory import UserPassCredentials

azure_account = ''
azure_pwd = ''

def get_credential(tenant_id: str = None):
    if tenant_id:
        return UserPassCredentials(
            azure_account,
            azure_pwd,
            tenant=tenant_id
        )
    else:
        return UserPassCredentials(
            azure_account,
            azure_pwd,
        )


def get_entities(tenant_id=None):
    credentials = get_credential(tenant_id)

    mgmt_groups_api = ManagementGroupsAPI(credentials)
    entities = mgmt_groups_api.entities.list()
    entity_infos = [entity for entity in entities]
    entity_names = [entity.display_name for entity in entity_infos]
    print(f'    entities: entity_names')


def get_tenants():
    credentials = get_credential()
    sub_client = SubscriptionClient(credentials)
    tenants = sub_client.tenants.list()
    return tenants


def main():
    tenants = get_tenants()

    i = 0
    print('[tenant list]')
    for tenant in tenants:
        print(f'tenant i:')
        print(f'    name:     tenant.display_name')
        print(f'    id:       tenant.tenant_id')
        get_entities(tenant.tenant_id)
        print()
        i = i + 1


if __name__ == '__main__':
    main()

输出

[tenant list]
tenant 0:
    name:     tenant1
    id:       00000000-0000-0000-0000-000000000000
    entities: ['Tenant Root Group', 'group A', 'subGroup B', 'Microsoft Partner Network', 'subscription 2']

tenant 1:
    name:     tenant2
    id:       00000000-0000-0000-0000-000000000000
    entities: ['Tenant Root Group', 'subscription 3']

【讨论】:

以上是关于如何从不同的 AAD 租户获取管理组和订阅?的主要内容,如果未能解决你的问题,请参考以下文章

如何识别来自不同租户nestjs多租户jwt的jwt令牌

X-Admin&ABP框架开发-版本管理

AZURE - 如何将资源从租户迁移到另一个租户

即使管理员已经同意,也会触发 ADAL 用户同意

我们如何从应用程序 B 访问应用程序“A”的 API。如果两者都在 Auth0 的不同租户中

如何将 Azure 托管磁盘克隆到不同的订阅中?