Azure Graph API、Angular、获取用户组

2023-12-14

我想查询 Azure AD Graph API 以检索团体声称对于从注册的 Azure B2C 应用程序登录的用户。我调用的应用程序是 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 端点访问我的 B2C 应用程序的信息https://graph.windows.net/myorganization/users?api-version=1.6使用 MSAL.js 但出现错误“代码”:“Authentication_MissingOrMalformed”。我验证了 MSAL 已检索令牌并将其添加到请求中。当我将网址更改为无效网址时,我收到相同的错误。我搜索过并发现有同样问题的问题here, here,但没有人回答

我该如何修复这个错误?

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

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

这个应用程序需要多租户吗?

我找到了资源访问令牌 and scopes但我使用的是 Angular 5 / typescript,并且没有 .NET 中提供的 Azure AD 图形客户端库。我无法利用这两种资源。


我想写这篇文章是为了帮助其他可能陷入与我相同的困境的人,试图找到一个基本的方向/理解。我基本上采用了 @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 并得到有限回复的类似问题

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure Graph API、Angular、获取用户组 的相关文章

  • 订阅的角度替代方案?

    我使用的是异步订阅 因此计数器变量在更新之前被返回 是否有另一种订阅方法 允许我仅在计数器变量更新为从后端获取的值后才返回计数器变量 makeOffer product string offer number number let form
  • Angular 2 不导入 Bootstrap css

    直接来自https angular io docs ts latest guide forms html https angular io docs ts latest guide forms html 让我们添加样式表 在应用程序根文件夹
  • Jhipster 生成器跳过 --skip-server 处的身份验证代码

    为什么当我们使用 skip server 生成项目时 哟 jhipster skip server 部分身份验证丢失 在 AJS A2 上 是吗 每次我需要粘贴部分代码 Angular 上的 AuthServerProvider 或 Ang
  • 无法将 TXT 记录设置为 Freenom 提供商中的域

    我想为分配给 Azure 中 WordPress 的域启用 SSL 我的域名是在 Freenom 中创建的 要完成该过程 我需要从 Azure 手动验证域 Azure 域验证 https i stack imgur com 4park jp
  • Angular 2 SPA Azure Active Directory JWT 问题

    想知道是否有 Azure Active Directory Angular 2 Adal 专家可以提供帮助 我的设置如下 具有三个应用程序注册的 Azure Active Directory 一种用于 Web API 一种用于 WPF 应用
  • WCF 5.0 和 oData 3.0 API 不适用于 Azure 表存储

    在我迁移 WCF5 0 应用程序以与 azure 集成后 我无法将 oData 3 api 与 azure 表存储一起使用 我收到这个错误 定义了类型 System Data Services Client DataServiceRespo
  • 来自 Azure Application Insights Analytics API 的页面结果

    是否可以对 Analytics API 的结果进行 分页 如果我使用以下查询 通过http POST query customEvents project customDimensions FilePath timestamp where
  • 如何从 Microsoft Azure EventHub 获取事件计数?

    我想从 Microsoft Azure EventHub 获取事件计数 我可以使用 EventHubReceiver Receive maxcount 但在处理大量大事件时速度很慢 有 NamespaceManager GetEventHu
  • Angular 4 在 @ViewChild 上使用 setter

    我有一个演示here https stackblitz com edit angular dgmnlf file app 2Fchild component ts 我正在尝试使用 ngIf 将元素添加到 DOM 后获取该元素的高度 我试图通
  • 工作天蓝色日志记录设置

    我尝试设置跟踪日志记录有一段时间了 但就是无法让它正常工作 关于这个主题有这么多错误 过时的文章并没有帮助 但请有人给我一个良好且实用的设置 用于 Azure 1 6 的跟踪日志记录和查看 我想要做的就是能够从我的应用程序捕获和查看跟踪消息
  • RxJ 从 observable 中获取价值

    在组件中 singleEvent Observable
  • 如何在节点js中将消息发送到azure服务总线队列时指定内容类型为application/json?

    我正在使用发送消息到队列 azure service bus包装和sendMessages中提到的功能here https learn microsoft com en us azure service bus messaging serv
  • 无法重新加载/刷新活动路线

    我最近更新了新的 RC3 和 Router3alpha 似乎有些事情发生了变化 我注意到单击活动路径的链接不再导致组件重新加载 如何使用新的 router3 实现此行为 我的链接看起来像 a Link1 a 为了测试我只是在 ngOnIni
  • 无法访问azure webapp url

    实际上 我创建了一个 Web 应用程序并成功将我的代码部署到该 Web 应用程序中 但是当我尝试通过 URL 访问该 Web 应用程序时 它显示如下 您无权查看此目录或页面 我不知道为什么会这样 我尝试创建不同的网络应用程序 但仍然重复同样
  • tsconfig.json 中模块类型的区别

    在 tsconfig json 中 compilerOptions target es5 module commonjs moduleResolution node sourceMap true emitDecoratorMetadata
  • 使用占位符和 ngModel 动态生成输入元素

    我想以角度 2 动态生成输入元素 我有占位符标题数组和值数组 如下所示 在我的组件中 我有两个映射 如下所示 其中两个映射的键相同 将值映射到标题 const placeholderMap fullName Name value Produ
  • 获取元数据活动 ADF V2

    谁能解释一下 ADF V2 中新引入的获取元数据活动有什么用 实际上 learn microsoft com 中提供的信息不足以理解此 Activity 的用途 获取元数据活动的主要目的是 验证任何数据的元数据信息 当数据准备好 可用时触发
  • 如何在使用页面锚点导航时设置“激活”类以在 Angular 2 中引导导航栏?

    我正在使用 Angular 2 和 Bootstrap 4 创建一个单页网站 我创建了一个始终位于页面顶部的导航栏组件 并且我正在使用页面锚点导航 id 请注意 我还没有创建路由模块 到目前为止还没有必要这样做 导航栏代码如下
  • Angular 2获取元素高度

    我这里有一个非常简单的例子 它只是一个带有单个 div 的角度应用程序 是否可以获取div的角度高度 我想我可以用 ViewChild 和 offsetHeight 来做到这一点 import Component ElementRef Vi
  • 如何将翻滚窗口参数传递到数据工厂 UI 中的数据工厂管道?

    我已经定义了一个管道Azure Data Factory使用翻滚窗口触发器 如下所示 我希望我的活动能够接收翻滚窗口参数 trigger outputs windowStartTime and trigger outputs windowE

随机推荐