使用图形API

时间:2019-06-17 13:16:38

标签: azure active-directory multi-tenant onedrive azure-ad-graph-api

我正在尝试使用图谱API为多租户应用程序吸引所有用户。为此,我使用请求生成了访问令牌:

POST https://login.microsoftonline.com/common/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials

注意:请注意,在上述要求中,我使用common代替了{tenantID}。这只是一个成功尝试,就像在doc中为adminConsent建议的一样。

通过使用上面生成的访问令牌,我请求了用户API并收到以下错误

{
    "error": {
        "code": "Authorization_IdentityNotFound",
        "message": "The identity of the calling application could not be established.",
        "innerError": {
            "request-id": "56141b7d-dd5e-44b1-9395-cd15d02b52de",
            "date": "2019-06-17T12:42:19"
        }
    }
}

当我使用租户ID生成令牌时,它只会返回一个活动目录的用户。

谁能建议我要去哪里了?

3 个答案:

答案 0 :(得分:2)

由于使用的是公共端点,因此无法在此处使用客户端凭据流(无需用户即可获得访问权限)。您需要参考此document(代表用户获得访问权限)。

注意:当您使用身份验证代码授予流程(代表用户进行访问)时,需要授予已授权而不是应用程序权限。

enter image description here

获取访问令牌

enter image description here

答案 1 :(得分:0)

在多租户应用程序中,将在访问该应用程序的每个租户中创建服务主体对象。这些服务主体对象将保存特定于该租户的同意(用户/管理员)对象,并且秘密也链接到这些对象。

因此,当您获得令牌时,令牌始终是特定于租户的,您需要为每个租户获取单独的令牌以在该租户中执行任何操作。

示例:考虑您有一个在租户A中注册的多租户应用程序,并且也被租户B,C和D使用。这也会在租户B,C和D中创建SP对象。

因此,如果需要在租户B中执行任何操作,则需要SP B的令牌并使用与其链接的机密。

简而言之,如果要在应用程序的上下文中执行这些操作,则需要所有租户的凭据。

答案 2 :(得分:0)

我最近不得不实施这个,在这方面取得了成功。这些是我已经完成的步骤。

  1. 创建了一个多租户应用
  2. 授予应用程序权限
  3. 使用特定于租户的身份验证标头配置 GraphClient。

这是获取租户特定图形客户端的代码。

private ClientCredentialProvider GetGraphAuthProvider(Guid tenantId) {
            IConfidentialClientApplication confidentialClientApplication = ConfidentialClientApplicationBuilder
                .Create(_configuration["AzureAd:ClientId"])
                .WithTenantId(Convert.ToString(tenantId))
                .WithClientSecret(_configuration["AzureAd:ClientSecret"])
                .Build();
            return new ClientCredentialProvider(confidentialClientApplication);
        }

        public GraphServiceClient GetGraphServiceClient(Guid tenantId) = >new GraphServiceClient(GetGraphAuthProvider(tenantId));
    }
}

我已经在my blog here中解释了所有内容。