afr*_*111 4 azure azure-ad-graph-api azure-ad-b2c azure-ad-msal angular
我想查询 Azure AD Graph API 以从注册的 Azure B2C 应用中检索登录用户的组声明。我正在调用的应用程序是 Angular 5 SPA。
在试用 Azure Active Directory 和 adal-angular4 后,我成功检索了用户的自定义角色 claim。为此,我注册了一个 Azure AD 应用程序,设置了所需的权限范围,向应用程序的清单中添加了自定义角色,将用户添加到了应用程序中,并为用户设置了自定义角色。然后,我将我新注册的应用程序的应用程序 ID 和租户用于 adal-angular4 配置。当我查询端点时,我得到包含角色声明的令牌。它运作良好。当我更改角色时,它会显示在令牌中。
这个角色声明对我来说已经足够了,但它需要两次登录,一次用于我的 B2C 应用程序,另一次用于我的其他注册应用程序。我不认为我可以对两者使用相同的令牌。
为了只有一个登录,我想直接查询Azure B2C。我听说它不提供查询用户角色的功能,如 Azure Active Directory,并且已被定向到使用用户组。我还看过文档,并被告知我需要使用 Azure Graph API,因为 Microsoft Graph 尚未实现查询此信息的功能。
我尝试遵循与 AAD 一起使用的类似 B2C 路径。我创建了一个组并向该组添加了一个用户。我尝试使用 MSAL.js通过 Azure Graph API 端点https://graph.windows.net/myorganization/users?api-version=1.6访问我的 B2C 应用程序的信息,但出现错误“代码”:“Authentication_MissingOrMalformed” . 我验证了 MSAL 检索了令牌并已将其添加到请求中。当我将 url 更改为无效的 url 时,我收到相同的错误。我在这里,这里搜索并发现了相同问题的问题,但没有人回答
我该如何解决这个错误?
是否有必要拥有本地管理员帐户?
我需要在我的 B2C 应用程序上设置任何特殊的范围来授予我的查询授权吗?如果有,具体是什么?我试图将范围的不同值交换到 MSAL 配置中,但没有找到任何有效的方法。
这个应用程序需要多租户吗?
我找到了有关访问令牌和范围的资源,但我使用的是 Angular 5 / typescript 并且没有 .NET 中可用的 Azure AD Graph 客户端库。我一直无法利用这两种资源。
我想写这篇文章来帮助其他人,他们可能会陷入与我试图找到基本方向/理解的相同模式中。我基本上采用了@Chris Pradget 描述的工作流程。不过,我对这个问题的最初看法是错误的,我会澄清我的错误在哪里并提供一些背景信息。
我最初的目标是在用户登录到我的 Azure / Angular 应用程序时带来用户的角色和/或组声明。当您使用 Azure B2C 登录以获取策略时,Azure 没有简单的方法来执行此操作。(在某些方面,Firebase 似乎让这一切变得简单)。
经过大量研究并没有真正理解大局,我看到了似乎是相互矛盾的信息,需要一些时间来整理。最终我找到了我正在寻找的信息,即我不能只有一个登录名。
(请注意,我将我的经典 Azure AD 注册应用称为“应用注册”,只是为了与 Azure 门户中的代码实现和配置设置区分开来)
进行了大量实验,但我想出了一些似乎有效的方法。我基本上检索了 3 个令牌,2 个在 Angular 中使用 MSAL.js,一个在 .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 Graph explorer和MS Graph Explorer。
我花了一段时间才成功查询 Microsoft Graph,但是当我这样做时是通过 如上所述的MS Graph Explorer。我第一次遇到的主要问题是当我使用自己的帐户查询我的应用程序时。只有一些查询有效,甚至那些带回的信息也非常有限。直到我重新阅读有关 Azure AD Graph API 的这篇文章时,我才注意到为了查询 Graphs,您需要使用租户域本地的用户 ID 并且是管理员。当我创建并使用租户的管理员(来自该域)时,所有查询都有效。所以就我上面的问题而言:
1) 我该如何解决这个 ["code": "Authentication_MissingOrMalformed"] 错误? 使用本地管理员帐户
2) 是否有必要拥有本地管理员帐户? 是的
3) 我需要在我的 B2C 应用程序上设置任何特殊的范围来授予我的查询授权吗?如果有,具体是什么? 要使用 ADAL 以您想要的方式查询 MS Graph,请使用 Directory.Read Access
4) 这个应用程序需要多租户吗? 不
此外,在我的研究中,我发现您可以使用 Azure AD 角色,而不是使用 B2C 组。具体来说,可以将应用程序角色添加到 Azure 门户中的经典 Azure AD 应用程序清单。这是一条不同的路线,对我来说看起来很有希望。我找到了这篇文章描述如何编辑清单以添加应用程序角色。首先将角色添加到清单,然后将用户分配给 Azure 门户中的角色,然后使用 ADAL.js 库查询用户信息(来自 Angular)。当您使用该库登录时,应用程序角色会根据所获取的令牌而关闭。这当然不使用 B2C 策略。此外,这可能不言而喻,但是当您登录时,B2C id_token 或 access_token 都不能用于获取经典 Azure AD 凭据/令牌。我试着想其他方法来完成我想要的。鉴于这 2 个注册在同一个租户中,我认为我可以使用单点登录来登录一个,而另一个则保持登录状态。我没有走多远。
此外,当@Chris Padgett 提到创建“用户 API”时,我误解了它。我认为“用户 api”是指我的经典 Azure 广告应用注册,它是在 Azure 门户中设置的,包含我的用户信息,并充当 api 来检索我的令牌。我以为我首先需要从 Angular 中的 B2C 获取访问令牌,然后使用该令牌(仍在 Angular 中)访问我的 Azure AD 经典注册。从那里我将能够拉下我的用户信息,包括应用程序角色(可通过编辑清单访问)。这是行不通的,因为正如我上面所说,我想通过一次登录来完成此操作,并且您不能在经典 Azure AD 应用程序中使用 B2C 令牌。即使它确实有效,它需要在我不想做的 B2C 应用程序之外的经典 Azure AD 应用程序注册中为用户设置角色。将一个应用程序注册为策略,另一个应用程序来管理用户的角色并不是很优雅。此外,让它工作需要 2 次登录,一次用于 B2C,一次用于经典 Azure AD。在这种方法中,感觉这 2 个应用程序是独立的,我不想在 2 个平台之间分散关注点。所以,最后在Angular中用B2C登录,然后用MS Graph打服务器拉用户群的场景是更好的。后端应用程序只需要登录一次,与访问它的用户无关,这意味着用户不需要登录两次。它还将我的信息整合到我的 B2C 应用程序注册中。将一个应用程序注册为策略,另一个应用程序来管理用户的角色并不是很优雅。此外,让它工作需要 2 次登录,一次用于 B2C,一次用于经典 Azure AD。在这种方法中,感觉这 2 个应用程序是独立的,我不想在 2 个平台之间分散关注点。所以,最后在Angular中用B2C登录,然后用MS Graph打服务器拉用户群的场景是更好的。后端应用程序只需要登录一次,与访问它的用户无关,这意味着用户不需要登录两次。它还将我的信息整合到我的 B2C 应用程序注册中。将一个应用程序注册为策略,另一个应用程序来管理用户的角色并不是很优雅。此外,让它工作需要 2 次登录,一次用于 B2C,一次用于经典 Azure AD。在这种方法中,感觉这 2 个应用程序是独立的,我不想在 2 个平台之间分散关注点。所以,最后在Angular中用B2C登录,然后用MS Graph打服务器拉用户群的场景是更好的。后端应用程序只需要登录一次,与访问它的用户无关,这意味着用户不需要登录两次。它还将我的信息整合到我的 B2C 应用程序注册中。感觉这 2 个应用程序是独立的,我不想在 2 个平台上分散关注。所以,最后在Angular中用B2C登录,然后用MS Graph打服务器拉用户群的场景是更好的。后端应用程序只需要登录一次,与访问它的用户无关,这意味着用户不需要登录两次。它还将我的信息整合到我的 B2C 应用程序注册中。感觉这 2 个应用程序是分开的,我不想在 2 个平台上分散关注。所以,最后在Angular中用B2C登录,然后用MS Graph打服务器拉用户群的场景是更好的。后端应用程序只需要登录一次,与访问它的用户无关,这意味着用户不需要登录两次。它还将我的信息整合到我的 B2C 应用程序注册中。
我认为 Azure 将来可能最终会在其 id_tokens 上提供组和/或角色,但我认为此信息在此期间可能对人们有所帮助。此外,这里是我提出的其他相关问题的链接,这些问题有助于指导我的研究:
了解到我需要在 ADAL.js 上使用 MSAL.js 才能使用 B2C 策略。
我问过的一个类似的问题是关于查询 MS Graph 并获得有限的响应
| 归档时间: |
|
| 查看次数: |
5213 次 |
| 最近记录: |