通过身份从多租户应用程序功能访问图形 API

问题描述 投票:0回答:1

我在租户 A 中有一个 C# 多租户 Azure Function App,它使用 Microsoft Identity Platform 进行身份验证。它已在租户 A 和租户 B 中被授予应用程序级 Microsoft Graph 权限 (

Directory.Read.All
)。使用客户端机密凭据,我可以成功从租户 A 和租户 B 检索用户列表,无论该函数是否正在运行本地或部署在云端。

我想了解是否可以利用功能应用程序本身的身份(即使用托管身份)而不是客户端密钥来访问租户 B 的用户。具体来说,我希望租户 A 中的功能应用程序访问用户在租户 B 中通过 .NET Microsoft Graph SDK 实现,无需依赖客户端密钥。 任何人都可以提供有关如何实现这一目标的指导吗? 预先感谢。

azure azure-active-directory
1个回答
0
投票

注意:托管标识只能用于访问同一租户和特定的 Azure 订阅用户/资源,无法访问其他租户用户/资源。请参阅 SO Thread,作者为 Philippe Signoret 以及此 MsDoc

因此,如果您不希望用户交互来获取结果,则需要使用客户端秘密凭证流。

如果用户交互流程在您的设置中有效,那么您可以使用交互式提供商流程,如下所示:

TenantA
中,我创建了一个多租户应用程序并配置了重定向 URL,如下所示:

enter image description here

并使用以下代码:

  • 交互流程不需要客户端密钥。
class Program
{
    static async Task Main(string[] args)
    {
        var scopes = new[] { "Directory.Read.All" }; 
        var tenantId = "organizations"; 
        var clientId = "ClientID";

        var options = new InteractiveBrowserCredentialOptions
        {
            TenantId = tenantId,
            ClientId = clientId,
            AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,
            RedirectUri = new Uri("http://localhost"), 
        };
        var interactiveCredential = new InteractiveBrowserCredential(options);
        var graphClient = new GraphServiceClient(interactiveCredential, scopes);
        await FetchUsers(graphClient);
    }

    private static async Task FetchUsers(GraphServiceClient graphClient)
    {
        try
        {
            var result = await graphClient.Users.GetAsync((requestConfiguration) =>
            {
                requestConfiguration.QueryParameters.Select = new string[] { "id", "displayName" }; 
            });
            foreach (var user in result.Value)
            {
                Console.WriteLine($"User ID: {user.Id}, Display Name: {user.DisplayName}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error fetching users: {ex.Message}");
        }
    }
}

我登录了

TenantB
用户:

enter image description here

并成功获得用户:

enter image description here

如果上述内容不适合您的环境,那么您还可以使用基于证书的身份验证来获取客户端机密凭证,而不是使用客户端机密。

© www.soinside.com 2019 - 2024. All rights reserved.