首页 > 解决方案 > 通过 Web API 控制器读取 Azure AD 组失败,并显示“权限不足,无法完成操作”

问题描述

我在我公司的 AAD 中注册了一个 Web API 应用程序。这是一个多租户应用程序,能够查询订阅客户的 AAD。当客户订阅我们的服务时,他们会在其 AAD 的企业应用程序注册部分注册我们的应用程序,并向我们提供tenantId、clientId 和 clientSecret。然后我们使用这些参数来查询客户的 AAD。

我正在使用以下内容从客户的 Azure AD 中读取组:

    public async Task<GraphServiceClient> CreateGraphServiceClient(string tenantId, string clientId, string clientSecret)
    {
        string aadInstance = "https://login.microsoftonline.com/{0}";
        string resource = "https://graph.microsoft.com";
        string authority = string.Format(aadInstance, tenantId);

        AuthenticationContext authContext = new AuthenticationContext(authority);
        ClientCredential credentials = new ClientCredential(clientId, clientSecret);
        var authResult = await authContext.AcquireTokenAsync(resource, credentials);
        if(authResult == null)
        {
            throw new Exception("GetGraphServiceClient: AcquireTokenAsync failed!");
        }

        var accessToken = authResult.AccessToken;
        var graphServiceClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(
                requestMessageClientOtherTenant =>
                {
                    requestMessageClientOtherTenant.Headers.Authorization = new AuthenticationHeaderValue("bearer", accessToken);
                    return Task.FromResult(0);
                }));

        return graphServiceClient;
    }

//....
        var graphServiceClient = CreateGraphClient(tenantId, clientId, clientSecret);

        var graphGroupsPage = await graphServiceClient.Groups
            .Request()
            .Select(e => new {
                e.Id,
                e.DisplayName
            })
            .GetAsync();

我收到“权限不足,无法完成操作”错误。

我已经在网上看到了很多 2-3 岁的解决方法,但它们都不适合我。

在客户的“企业应用程序”部分授予应用程序的权限: 在此处输入图像描述

这些权限与我们在 AAD 注册中分配给应用程序的权限完全相同。

我在这里不知所措。似乎授予了所有必需的权限,但我仍然收到错误消息。

我可以使用相同的图形客户端毫无问题地从客户的 AAD 中获取所有用户。

任何建议将不胜感激。

标签: azureazure-active-directoryadalmsal

解决方案


当客户订阅我们的服务时,他们会在其 AAD 的企业应用程序注册部分注册我们的应用程序,并向我们提供tenantId、clientId 和 clientSecret。然后我们使用这些参数来查询客户的 AAD。

由于您的客户已授予您的多租户应用程序访问其租户信息,因此只tennantId需要客户的,您应该使用自己的多租户应用程序clientIdclientSecret访问客户的 AD。

如果您使用客户的client_id和secret,您应该检查他们的应用程序(不是企业应用程序)下的权限,但是,这没有任何意义。如果是这样,则无需使用您的多租户应用程序。


推荐阅读