"User not found" for Graph API 请求在 Azure 企业应用程序安全组中使用客户端凭据身份验证流

"User not found" for Graph API request in the Azure enterprise app security group with client credentials auth flow

设计

目标

获取给定用户的日历事件。

要求

  1. 应用程序应有权访问 MS Graph API。
  2. 应用程序应该像 daemon/background 进程一样运行,而不依赖于用户的登录。
  3. 应用程序应有权访问 Azure Active Directory (AAD) 中最少数量的用户数据。
  4. 应用程序应该能够获取用户的日历事件并创建它们。

实施/设置

测试

使用了两个 HTTP 请求:一个用于获取令牌,另一个用于读取事件。

  1. 来自 Identity Platform
  2. 的令牌请求
curl --location --request POST 'https://login.microsoftonline.com/<TENANT_ID>/oauth2/v2.0/token' \
--data-raw 'client_id=<APPLICATION_TOKEN>&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=<APPLICATION_SECRET>&grant_type=client_credentials'

检查令牌 here 我发现它包含所需的权限:

  "roles": [
    "Calendars.Read",
    "Calendars.ReadWrite"
  ]
  1. Graph API
  2. 获取日历事件的请求
curl --location --request GET 'https://graph.microsoft.com/v1.0/users/<USER_ID>/calendar/events' \
--header 'Authorization: Bearer <TOKEN>'

导致以下错误:

{
  "error": {
    "code": "ResourceNotFound",
    "message": "User not found",
    "innerError": {
      "date": "2022-02-08T08:25:39",
      "request-id": "bfaca1f9-e79b-491c-8d75-5a62317e299b",
      "client-request-id": "bfaca1f9-e79b-491c-8d75-5a62317e299b"
    }
  }
}

用户 ID 来自我在 Azure 租户的 Azure Active Directory 详细信息中找到的帐户。我在添加其他用户后仔细检查了这一点。

询问前调查

This 问题看起来最接近我的情况,因为它使用客户端凭据身份验证流程。但是它对 AAD 中的所有用户使用全局权限,而我们使用 security group 更细粒度的方法。在我的例子中,它还显示了一个不同的错误 "Resource could not be discovered.""User not found"

为了调用 /{user-id}/calendar/events 工作,如果您使用守护程序应用程序的客户端凭据,用户必须在 Exchange Online 上拥有邮箱。

此外,似乎无法为来宾帐户(在本例中为个人帐户)分配许可,因此用户帐户永远无法访问日历服务(o365 在线交换的一部分),因此无法检索个人账号的日历信息。

详细说明请参考我在Q&A中类似的回答

精简版
我遗漏了 application permissions 并假设它们是在 security group 级别上分配的。只有限制发生在那个级别。

长版
更新后的心智模型如下所示:

表示MS Graph APIapplication permissions是必须的
security group 仅限制/限制对 policy 中提到的用户的访问。