Azure Graph API, Angular, Get users Groups



我想查询 Azure AD 图形 API,以便从已注册的 Azure B2C 应用中检索登录用户的组声明。我调用的应用程序是一个Angular 5 SPA。

在尝试使用 Azure Active Directory 和 adal-angular4 后,我成功地检索了用户的自定义角色声明。为此,我注册了一个 Azure AD 应用,设置了所需的权限范围,将自定义角色添加到应用程序的清单,将用户添加到应用程序,并为用户设置了自定义角色。然后,我使用新注册的应用程序的应用程序 ID 和租户进行 adal-angular4 配置。当我查询端点时,我得到包含角色声明的令牌。效果很好。当我更改角色时,它会显示在令牌中。

这个角色声明对我来说就足够了,但它需要两次登录,一次用于我的 B2C 应用程序,一次用于我的另一个注册应用程序。我认为我不能对两者使用相同的令牌。

为了只有一个登录名,我想直接查询 Azure B2C。我听说它不提供像Azure Active Directory那样查询用户角色的功能,并且已被指示使用用户组。我还看过文档,并被告知我需要使用 Azure 图形 API,因为Microsoft Graph 尚未实现查询此信息的功能。

我尝试遵循与 AAD 一起使用的类似 B2C 路径。我创建了一个组并将一个用户添加到该组。我尝试使用 MSAL https://graph.windows.net/myorganization/users?api-version=1.6 Azure 图形 API 终结点访问我的 B2C 应用的信息.js但收到错误"代码":"Authentication_MissingOrMalformed"。我验证了令牌是否已由 MSAL 检索并正在添加到请求中。当我将 url 更改为无效的 url 时,我收到相同的错误。我在这里,这里搜索并找到了具有相同问题的问题,但没有一个得到解答

如何修复此错误?

是否有必要拥有本地管理员帐户?

是否需要在 B2C 应用上设置任何特殊范围才能为查询授予授权?如果有,具体是什么?我试图将范围的不同值交换到 MSAL 配置中,但没有找到任何有效的方法。

此应用是否需要为多租户?

我找到了有关访问令牌和范围的资源,但我使用的是 Angular 5/打字稿,并且没有 .NET 中可用的 Azure AD 图形客户端库。我无法使用这两种资源。

我想写这篇文章是为了帮助那些可能陷入与我相同的困境的人,试图找到一个基本的方向/理解。 我基本上采用了Pradget@Chris描述的工作流程。不过,我对这个问题的最初看法是错误的,我将澄清我的错误在哪里,并提供一些背景。

我最初的目标是在用户登录到我的 Azure/Angular 应用时引入用户的角色和/或组声明。(在某些方面,Firebase似乎使这变得容易)。

经过一堆研究,并没有真正理解大局,我看到了似乎相互矛盾的信息,需要一些时间来整理。最终,我找到了我正在寻找的信息,即我不能只有一次登录。

(请注意,我将经典的 Azure AD 注册应用称为"应用注册",只是为了与代码实现和 Azure 门户中设置的配置区分开来)

这需要大量的实验,但我想出了一些似乎有效的东西。我基本上检索了 3 个令牌,其中 2 个使用 MSAL 在 Angular 中.js一个在 .NET 中使用 ADAL 用于Microsoft Graph。Angular 中的一个用于初始登录(MSAL 客户端的登录重定向调用)以检索id_token,另一个我使用该令牌和 aquireTokenSlient 函数检索access_token。我将其发送到我的 .NET Core 后端,在那里我使用传入令牌中的用户 ID 作为资源 ID 来请求Microsoft Graph 以获取我的组声明,然后我制作了自己的 JWT 令牌,其中包含要发送回 Angular 的声明以供我的路由守卫使用

。在我的研究中需要注意的事情:

AzureAD Graph vs Microsoft Graph 来拉取用户组:关于使用哪个信息存在冲突,有人说Microsoft Graph,因为 Azure Graph 正在被弃用,但其他人说 Azure Graph,因为 MS Graph 尚未涵盖所有基础。 经过实验,我发现我能够将用户的组从MS Graph中提取出来。 鉴于这一点以及MS Graph较新的事实,我选择了MS Graph。为了试验图形,我使用了 Azure 图形资源管理器和 MS 图形资源管理器。

我花了一段时间才成功查询Microsoft图,但是当我这样做时,如上所述是通过MS Graph Explorer。我第一次遇到的主要问题是当我使用自己的帐户查询我的应用程序时。 只有一些查询有效,甚至那些带回的信息非常有限。直到我重新阅读了这篇有关 Azure AD 图形 API 的文章,我才注意到,为了查询图形,需要使用租户域的本地用户 ID,并且是管理员。当我创建并使用租户的管理员(从该域)时,所有查询都有效。所以就我上面的问题而言:

1) 如何修复此 ["代码": "Authentication_MissingOrMalformed"] 错误?使用本地管理员帐户

2) 是否有必要拥有本地管理员帐户?是的

3) 是否需要在 B2C 应用上设置任何特殊范围才能为我的查询授予授权?如果有,具体是什么?若要使用 ADAL 以所需的方式查询 MS 图形,请使用 Directory.Read Access

4) 此应用是否需要是多租户?

此外,在我的研究中,我发现可以使用 Azure AD 角色,而不是使用 B2C 组。具体而言,可以将应用程序角色添加到 Azure 门户中的经典 Azure AD 应用清单。这是一条不同的路线,对我来说看起来很有希望。 我找到了这篇文章,其中描述了如何编辑清单以添加应用程序角色。首先将角色添加到清单,然后将用户分配到 Azure 门户中的角色,然后使用 ADAL.js 库查询用户信息(从 Angular)。使用库登录时,应用程序角色将在获取的令牌上关闭。这当然不使用 B2C 策略。这可能不言而喻,但在登录时,B2C id_token或access_token都不能用于获取经典 Azure AD 凭据/令牌。我试着想其他方法来完成我想要的。鉴于 2 个注册位于同一租户中,我认为我可以使用单点登录一个并保持另一个的登录状态。我没有走多远。我考虑的另一种方法是使用自定义策略从我的 Azure AD 经典应用中检索数据,但也没有走得太远。

另外,当@Chris帕吉特提到创建"用户api"时,我误解了它。通过"用户 api",我认为他指的是我的经典 Azure 广告应用注册,该注册在 Azure 门户中设置,包含我的用户信息,并充当检索令牌的 API。我以为我首先需要从 Angular 中的 B2C 获取访问令牌,然后使用该令牌(仍在 Angular 中)访问我的 Azure AD 经典注册。 从那里,我将能够提取用户的信息,包括应用程序角色(可通过编辑清单访问)。这行不通,因为正如我上面所说,我想通过一个登录名执行此操作,并且不能在经典 Azure AD 应用中使用 B2C 令牌。即使它确实有效,它也需要在 B2C 应用之外的经典 Azure AD 应用注册中为用户设置角色,而我不想这样做。为策略注册一个应用,为用户角色注册另一个应用并不是很优雅。 此外,要使其正常工作还需要 2 次登录,一次用于 B2C,一次用于经典 Azure AD。在这种方法中,感觉这两个应用程序是分开的,我不想在 2 个平台上划分问题。因此,最终,在 Angular 中使用 B2C 登录,然后点击服务器以使用 MS Graph 拉取用户组的场景是一个更好的方案。 后端应用只需登录一次,独立于访问它的用户,这意味着用户不需要登录两次。 此外,它还将我的信息整合到我的 B2C 应用程序注册中。

我认为 Azure 最终可能会在未来提供组和/或角色id_tokens,但我认为这些信息在此期间可能对人们有所帮助。此外,这里还有我提出的其他相关问题的链接,这些问题有助于指导我的研究:

了解到我需要使用 MSAL.js而不是 ADAL.js才能使用 B2C 策略。

我问了一个关于查询MS Graph并获得有限响应的类似问题

AzureAD B2C 使用 Azure AD v2.0 终结点颁发令牌:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token

AzureAD Graph API 需要使用 Azure AD v1.0 终结点颁发的令牌:

https://login.microsoftonline.com/{tenant}/oauth2/token

若要使单页应用程序访问 Azure AD 图形 API,必须使用代理 API(我将其称为用户 API)桥接它们,如下所示。

在设计时:

  1. 使用 Azure AD B2C 门户注册单页应用程序。
  2. 使用 Azure AD 门户注册用户 API,并授予"读取目录数据">权限。

在运行时:

  1. 单页应用程序将最终用户重定向到 Azure AD B2C v2.0 终结点进行登录。Azure AD B2C 颁发包含用户标识符的 ID 令牌。
  2. 单页应用程序使用此 ID 令牌调用用户 API。用户 API 验证 ID 令牌。
  3. 用户 API 使用在步骤 2 中的设计时创建的应用程序凭据从 Azure AD v1.0 终结点获取访问令牌。
  4. 用户 API 调用 Azure AD 图形 API,将步骤 2 中收到的用户标识符与步骤 3 中颁发的访问令牌传递,查询组成员身份,然后将这些成员身份返回到单页应用程序。

最新更新