我想写这篇文章是为了帮助其他可能陷入与我相同的困境的人,试图找到一个基本的方向/理解。我基本上采用了 @Chris Pradget 描述的工作流程。不过,我对这个问题的最初看法是错误的,我将澄清我的错误所在并提供一些背景信息。
我最初的目标是当用户登录我的 Azure / Angular 应用程序时引入用户的角色和/或组声明。当您使用 Azure B2C 登录策略时,Azure 没有简单的方法来执行此操作。 (在某些方面,Firebase 似乎使这变得容易)。
经过一系列研究后,我并没有真正理解大局,我看到了一些似乎相互矛盾的信息,需要一些时间来整理。最终我找到了我正在寻找的信息,那就是我不能只有一次登录。
(请注意,我将经典的 Azure AD 注册应用程序称为“应用程序注册”,只是为了与 Azure 门户中的代码实现和配置集进行区分)
我进行了大量的实验,但我想出了一些似乎有效的方法。我基本上检索了 3 个令牌,其中 2 个在 Angular 中使用 MSAL.js,1 个在 .NET 中使用 ADAL for Microsoft Graph。 Angular 中的一个用于初始登录(MSAL 客户端的 loginRedirect 调用)以检索 id_token,另一个是我使用该令牌以及 aquireTokenSlient 函数来检索 access_token。我将其发送到我的 .NET Core 后端,在其中我使用传入令牌中的用户 ID 作为资源 ID向 Microsoft Graph 发出请求得到我的团体的索赔,然后我制作了我自己的 JWT 令牌并声称将我的路线守卫发送回 Angular。
我的研究中值得注意的事情:
Azure AD Graph 与 Microsoft Graph 来拉动用户组:关于使用哪一个的信息存在冲突,有人说使用 Microsoft Graph,因为 Azure Graph 已被弃用,但也有人说使用 Azure Graph,因为 MS Graph 尚未涵盖所有基础。经过实验,我发现我能够从 MS Graph 中提取用户组。鉴于这一点以及 MS Graph 较新的事实,我选择了 MS Graph。为了对图表进行实验,我使用了两者Azure 图形浏览器 and MS 图形浏览器.
我花了一段时间才成功查询 Microsoft Graph,但是当我这样做时MS 图形浏览器如上所述。我第一次遇到的主要问题是当我用自己的帐户查询我的应用程序时。只有一些查询有效,甚至那些查询也返回非常有限的信息。直到我重新阅读本文关于 Azure AD Graph API,我注意到为了查询图表,您需要使用租户域本地的用户 ID,并且是管理员。当我创建并使用租户的管理员(来自该域)时,所有查询都有效。就我上面的问题而言:
1)如何修复此[“code”:“Authentication_MissingOrMalformed”]错误?使用本地管理员帐户
2)是否需要有本地管理员帐户?
Yes
3) 我需要在 B2C 应用程序上设置任何特殊范围才能授予我的查询授权吗?如果有,具体是什么?要使用 ADAL 以您想要的方式查询 MS Graph,请使用 Directory.Read Access
4)这个应用程序需要多租户吗?
No
另外,在我的研究中,我发现您可以使用 Azure AD 角色,而不是使用 B2C 组。具体来说,可以将应用程序角色添加到 Azure 门户中的经典 Azure AD 应用程序清单中。这是一条对我来说看起来很有希望的不同路线。我发现本文描述如何编辑清单以添加应用程序角色。首先将角色添加到清单中,然后将用户分配给 Azure 门户中的角色,然后使用 ADAL.js 库查询用户信息(来自 Angular)。当您使用库登录时,应用程序角色将在获取的令牌上关闭。这当然不使用 B2C 策略。此外,这可能是不言而喻的,但是当您登录时,B2C id_token 或 access_token 都不能用于获取经典 Azure AD 凭据/令牌。我试图想出其他方法来实现我想要的目标。鉴于这两个注册位于同一个租户中,我认为我可以使用单点登录来登录其中一个,并保持另一个注册的登录状态。我没走多远。我考虑的另一种方法是使用自定义策略从我的 Azure AD 经典应用程序检索数据,但也没有走得太远。
另外,当 @Chris Padgett 提到创建“用户 api”时,我误解了它。我认为“用户 api”指的是我的经典 Azure Ad 应用程序注册,它是在 Azure 门户中设置的,包含我的用户信息,并充当检索我的令牌的 api。我认为我首先需要从 Angular 中的 B2C 获取访问令牌,然后使用该令牌(仍在 Angular 中)访问我的 Azure AD 经典注册。从那里我可以提取用户的信息,包括应用程序角色(可以通过编辑清单进行访问)。这行不通,因为正如我上面所说,我想通过一次登录来完成此操作,并且您无法在经典 Azure AD 应用程序中使用 B2C 令牌。即使它确实有效,也需要在我的 B2C 应用程序之外的经典 Azure AD 应用程序注册中为用户设置角色,但我不想这样做。让一个应用程序注册策略并使用另一个应用程序来管理用户角色并不是很优雅。此外,要使其正常工作还需要 2 次登录,一次用于 B2C,一次用于经典 Azure AD。在这种方法中,感觉这两个应用程序是独立的,我不想在两个平台之间分配问题。所以,最终,在 Angular 中用 B2C 登录,然后用 MS Graph 去服务器拉取用户组的场景是更好的一种。后端应用程序只需要登录一次,与用户访问它无关,这意味着用户不需要登录两次。它还将我的信息合并到我的 B2C 应用程序注册中。
我认为 Azure 最终可能会在未来提供其 id_token 上的组和/或角色,但我认为此信息同时可能对人们有所帮助。此外,这里还有我提出的其他相关问题的链接,这些问题有助于指导我的研究:
了解我需要使用 MSAL.js 而不是 ADAL.js 才能使用 B2C 策略。
我问过一个关于查询 MS Graph 并得到有限回复的类似问题