Azure Graph API、Angular、获取用户组

Azure Graph API, Angular, Get users Groups

我想查询 Azure AD Graph API 以从已注册的 Azure B2C 应用程序中检索已登录用户的 groups 声明。我调用的应用程序是 Angular 5 SPA。

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

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

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

我尝试遵循与 AAD 一起使用的类似 B2C 路径。我创建了一个组并向该组添加了一个用户。我尝试使用 Azure Graph API 端点 https://graph.windows.net/myorganization/users?api-version=1.6 using MSAL.js but I get the error "code": "Authentication_MissingOrMalformed". I verified that a token is retrieved by MSAL and is being added to the request. When I change the url to one that is invalid, I get the same error. I have searched and found questions with the same problem here, here 访问我的 B2C 应用程序的信息,但是 none 得到了答复

如何解决这个错误?

是否需要本地管理员帐户?

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

此应用是否需要多租户?

我在 access tokens and scopes 上找到了资源,但我使用的是 Angular 5 / typescript,没有 .NET 中可用的 Azure AD 图形客户端库。我无法利用这两种资源。

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

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

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

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

要让单页应用程序访问 Azure AD Graph API,您必须使用代理桥接它们 API(我将其称为用户 API),如下

在设计时:

  1. 使用 Azure AD B2C 门户注册单页应用程序。
  2. Register the User API using the Azure AD portal and grant the Read directory data permission.

运行时:

  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 Graph API,传递在步骤 2 中收到的用户标识符,以及在步骤 3 中颁发的访问令牌,查询组成员身份,然后 returns 这些到单页应用程序。

我想写这篇文章来帮助那些可能陷入与我试图找到基本方向/理解相同的陈规的人。我基本上遵循了@Chris Pradget 描述的工作流程。不过,我最初对问题的看法是错误的,我会澄清我的错误所在并提供一些背景信息。

我最初的目标是在用户登录到我的 Azure / Angular 应用程序时引入用户的角色和/或组声明。当您使用 Azure B2C 登录策略时,Azure 没有简单的方法来执行此操作。 (在某些方面,Firebase 似乎让这一切变得简单)。

经过大量研究后,我并没有真正理解全局,我看到了似乎相互矛盾的信息,需要一些时间来整理。最后我找到了我要找的信息,就是我不能只有一个登录。

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

我进行了大量实验,但我想出了一些似乎可行的方法。我实际上检索了 3 个令牌,其中 2 个在 Angular 中使用 MSAL.js,一个在 .NET 中使用 ADAL for Microsoft Graph。 Angular 中的一个用于初始登录(MSAL 客户端的 loginRedirect 调用)以检索 id_token,另一个我使用该令牌与 aquireTokenSlient 函数一起检索以检索 access_token。我将它发送到我的 .NET Core 后端,在那里我使用传入令牌中的用户 ID 作为 request to Microsoft Graph to get my groups claim and then I crafted my own JWT token 中的资源 ID,并声明要发送回 Angular 用于我的路由守卫。

我研究中的注意事项:

Azure AD Graph 与 Microsoft Graph 拉动用户组:关于使用哪个的信息存在冲突,有人说 Microsoft Graph 是因为 Azure Graph 已被弃用,但其他人说 Azure Graph 是因为 MS Graph 不涵盖所有基地呢。试验后,我发现我能够从 MS Graph 中提取用户的组。鉴于此以及 MS Graph 较新的事实,我选择了 MS Graph。为了对图表进行实验,我同时使用了 Azure Graph explorer and MS Graph Explorer.

我花了一段时间才成功查询 Microsoft Graph,但是当我通过 MS Graph Explorer as stated above. The main problem I first encountered was when I queried my app with my own account. Only some queries worked and even those brought back very limited info. It wasn’t until I re-read this article 关于 Azure AD Graph API 时,我是否注意到为了查询 Graph,您需要使用租户域本地的管理员用户 ID。当我创建并使用租户的管理员(来自该域)时,所有查询都有效。所以就我上面的问题而言:

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

2) 是否需要本地管理员帐户?

3) 是否需要在我的 B2C 应用程序上设置任何特殊范围以授权我的查询?如果有,具体是什么? 要使用 ADAL 以您想要的方式查询 MS Graph,请使用 Directory.Read Access

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

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

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

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