Azure AD Graph 调用用户创建失败并出现一些模糊的错误

Posted

技术标签:

【中文标题】Azure AD Graph 调用用户创建失败并出现一些模糊的错误【英文标题】:Azure AD Graph call for User creation failing with some obscure error 【发布时间】:2015-11-27 16:37:33 【问题描述】:

有人告诉我在这里提出关于 Azure AD Graph Api 的问题,而不是作为相应 GitHub 示例存储库的问题提出,我希望 Azure Graph API 团队监控 SO 并可以帮助我们this github sample issue

问题的一些额外背景:

我们正在使用 Microsoft.Azure.ActiveDirectory.GraphClient nuget 在我们的 Azure AD 测试租户中创建和管理用户。关注this sample application 我们可以通过 Graph API 在 Azure AD 中创建和更新用户。直到大约 2-3 天前发生的某个时刻之前都很好(不确定确切的时刻,我们在周二早上 AU 时间发现了问题。最后一次成功运行是在上周五)。它是 100% 的工作代码,并且确认它不是我们的代码 - 我再次运行了示例应用程序 - 它现在也坏了。我已经使用最新的 GraphClient v2.1.0 和来自示例应用程序的原始版本进行了测试,即 - v2.0.6

为了简化对问题的测试,我制作了 a LINQ based sample 并编辑了一些秘密(如果你想运行它,你需要按照控制台应用程序示例指南输入你的值,而不是原始示例应用程序) 这也是 Fiddle 捕获(编辑)的

Authentication request-response (client-request-id: 88b2bbbd-94cd-498d-a147-caad05e16eb7) User Creation failing Attempt

提琴手捕获的一些注意事项 - Azure AD Graph API 不返回刷新令牌和访问令牌:

"expires_in":"3599","token_type":"Bearer","scope":"UserProfile.Read",
"expires_on":"1441183928","not_before":"1441180028","resource":"https://graph.windows.net",
"access_token":"TOKEN WAS HERE"

我可以在此处看到范围字符串的问题,但是在根据示例应用程序调用令牌时,我们没有在 GraphClient 中设置任何显式范围(正如我之前提到的,这段代码之前很好)

用户创建响应清楚地表明会发生什么以及为什么会发生

"odata.error":
    "code":"Authorization_RequestDenied","message":
        "lang":"en","value":"Insufficient privileges to complete the operation."
    

但不清楚如何通过这些AuthenticationContext.AcquireToken Method overloads 请求额外的权限范围 奇怪的是,同样的代码之前是完全正常的,现在在一些神秘的变化之后就被破坏了?

所以我有几个问题:

    如何在 GraphClient 库中添加额外的范围权限以在启用用户修改的情况下获取 Graph API 令牌。这可能是问题的创可贴解决方案。

    Azure AD 似乎尝试在 the portal 中管理客户端应用程序的权限。但是对于 Native Client 类型的应用程序没有额外的权限。如何显式更新应用程序权限,以便现有代码可以再次工作。有可能吗?

    谁能推荐其他库与 GraphAPI 进行交互,从而允许消费者明确指定请求令牌的范围?

================更新================

是的,我看到了同意流程文档。为了解决这个问题,我创建了新的 Azure AD 租户,添加了全新的应用程序并添加了所有可能的权限,包括所有可用的应用程序和委托权限: now it looks like this。我也

我可以得到一个范围很长的令牌,例如

Directory.AccessAsUser.All 目录.读取 Directory.Write 用户读 User.ReadWrite 用户阅读全部 User.ReadBasic.All User.ReadWrite.All user_impersonation UserProfile.Read

--切掉不相关的范围--

但它仍然给我 403 :

"odata.error":
    "code":"Authorization_RequestDenied","message":        
        "lang":"en","value":"Insufficient privileges to complete the operation."
    

有一点值得注意 - 在范围列表中没有 Directory.ReadWrite.All

But here docs says: Directory.ReadWrite.All:读写目录数据

================更新================

PS:Azure AD 工程师的一些技术请求信息:

身份验证请求响应的客户端请求 ID:88b2bbbd-94cd-498d-a147-caad05e16eb7。 失败的 Graph 调用仅在响应中具有 client-request-id: 882f3918-0ddd-40fe-a558-866997e32b46

【问题讨论】:

一些额外信息 - 尝试根据 oauth2 规范(4.4.2. 访问令牌请求)发布 scope=xxx 之类的范围。使用此列表中的范围值 msdn.microsoft.com/Library/Azure/Ad/Graph/api/… &scope=Directory.ReadWrite.All 获取具有相同“UserProfile.Read”范围的令牌。 设法获得具有许多权限的令牌(通过将 Office 365 统一 API 预览应用添加到我的 Web 客户端并将所有可能的权限委派添加到我的应用)。仍然没有运气 - 将与原始提琴手请求相同的数据发布到 graph.windows.net/58cc6e97-acd4-43ce-820f-50cfe5fd56e8/… HTTP/1.1 仍然给我 403“权限不足,无法完成操作”。 ocp-aad-diagnostics-server-name: 2+dALfFSWdN9j1pbjWetFSEVFN5y/lnZw/QCyG+ljYA= request-id: 70f46089-1a05-41d3-85c6-e90e1c0f75dd client-request-id: 5dec4e74-ac5d-4944-89ca6-01644c跨度> 【参考方案1】:

这里的问题是您没有正确配置您的应用程序以请求对 Graph API 的正确权限。 为此,您必须进入 Azure 管理门户并配置您的“对其他应用程序的权限”,以包括您的应用程序需要能够读取/写入目录的范围。

我们这里有一些文档可以帮助您: https://msdn.microsoft.com/en-us/library/azure/dn132599.aspx(描述同意流程) https://msdn.microsoft.com/Library/Azure/Ad/Graph/api/graph-api-permission-scopes(描述您的应用程序需要请求的图形 API 公开的特定权限)

我希望这会有所帮助!

【讨论】:

不多。查看更新的详细信息 - 我已经完成了更多步骤并获得了具有最大可用权限的令牌 - 仍然相同。 嗨,阿列克谢。只是在这里跟进,很抱歉没有早点回来。对于示例,您是请求仅作为应用程序访问,还是作为具有用户上下文的应用程序访问?在前一种情况下,您应该在“应用程序权限”列中设置“读写目录”权限。如果是后者,您应该在“委派权限”列中设置相同的权限,并且用户 必须 具有足够的权限来创建用户(因此租户管理员或用户帐户管理员)。如果这不起作用,请转发您解码的 JWT 令牌的 scp 声明,以便我们查看这些内容。 嗨,Dan,我们已经从那个问题移开了,但我会尝试回到它并恢复环境以重现该问题。我认为最简单的情况是运行该示例 - 它对我的租户也不能正常工作 - 无论是原始的还是新创建的。

以上是关于Azure AD Graph 调用用户创建失败并出现一些模糊的错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure AD B2C 图形 API 401 未经授权

Azure Ad Graph API,获取用户信息和用户设备信息

Azure AD B2C 连接的用户使用 Graph AD API 更改密码

使用 Group.Create 权限创建 Azure AD 组

如何以编程方式获取 Azure AD 应用程序的 Graph API 权限指南?

Azure AD B2C 错误 - IDX10501:签名验证失败