我正在尝试使用图谱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生成令牌时,它只会返回一个活动目录的用户。
谁能建议我要去哪里了?
答案 0 :(得分:2)
由于使用的是公共端点,因此无法在此处使用客户端凭据流(无需用户即可获得访问权限)。您需要参考此document(代表用户获得访问权限)。
注意:当您使用身份验证代码授予流程(代表用户进行访问)时,需要授予已授权而不是应用程序权限。
获取访问令牌
答案 1 :(得分:0)
在多租户应用程序中,将在访问该应用程序的每个租户中创建服务主体对象。这些服务主体对象将保存特定于该租户的同意(用户/管理员)对象,并且秘密也链接到这些对象。
因此,当您获得令牌时,令牌始终是特定于租户的,您需要为每个租户获取单独的令牌以在该租户中执行任何操作。
示例:考虑您有一个在租户A中注册的多租户应用程序,并且也被租户B,C和D使用。这也会在租户B,C和D中创建SP对象。
因此,如果需要在租户B中执行任何操作,则需要SP B的令牌并使用与其链接的机密。
简而言之,如果要在应用程序的上下文中执行这些操作,则需要所有租户的凭据。
答案 2 :(得分:0)
我最近不得不实施这个,在这方面取得了成功。这些是我已经完成的步骤。
这是获取租户特定图形客户端的代码。
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中解释了所有内容。