"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
设计
目标
获取给定用户的日历事件。
要求
- 应用程序应有权访问 MS Graph API。
- 应用程序应该像 daemon/background 进程一样运行,而不依赖于用户的登录。
- 应用程序应有权访问 Azure Active Directory (AAD) 中最少数量的用户数据。
- 应用程序应该能够获取用户的日历事件并创建它们。
实施/设置
- 完成 (1) Azure(企业)应用程序已按描述创建 here。
- 启用 (2) 客户端凭据流用于
application permissions
的设置
- 满足(3)一个
security group
- 如here - was created with a limited number of users with the related policy
that included related permissions (see here). The group was later connected to the app following this说明所述。
- 实施 (4) 操作 here and here 所需的
Calendar.Read
和 Calendar.ReadWrite
已添加到上一个设置步骤中提到的策略中。
测试
使用了两个 HTTP 请求:一个用于获取令牌,另一个用于读取事件。
- 来自
Identity Platform
的令牌请求
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"
]
- 从
Graph API
获取日历事件的请求
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 API
的application permissions
是必须的
security group
仅限制/限制对 policy
中提到的用户的访问。
设计
目标
获取给定用户的日历事件。
要求
- 应用程序应有权访问 MS Graph API。
- 应用程序应该像 daemon/background 进程一样运行,而不依赖于用户的登录。
- 应用程序应有权访问 Azure Active Directory (AAD) 中最少数量的用户数据。
- 应用程序应该能够获取用户的日历事件并创建它们。
实施/设置
- 完成 (1) Azure(企业)应用程序已按描述创建 here。
- 启用 (2) 客户端凭据流用于
application permissions
的设置
- 满足(3)一个
security group
- 如here - was created with a limited number of users with the relatedpolicy
that included related permissions (see here). The group was later connected to the app following this说明所述。 - 实施 (4) 操作 here and here 所需的
Calendar.Read
和Calendar.ReadWrite
已添加到上一个设置步骤中提到的策略中。
测试
使用了两个 HTTP 请求:一个用于获取令牌,另一个用于读取事件。
- 来自
Identity Platform
的令牌请求
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"
]
- 从
Graph API
获取日历事件的请求
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 API
的application permissions
是必须的
security group
仅限制/限制对 policy
中提到的用户的访问。