在 ADAL JS 中使用 Azure AD 和 OAuth2 隐式授权对声明进行分组

Group claims with Azure AD and OAuth2 implicit grant in ADAL JS

背景

我们正在 Azure 中开发多租户 SaaS 产品,它有一个 AngularJS 前端和 Web API 后端。我们使用 Azure AD 进行身份验证,并将其与 ADAL JS 连接起来(使用 OAuth2 隐式授权)。作为一个多租户应用程序,我们允许客户针对他们自己的 Azure AD(可能连接也可能不连接到本地 AD)进行身份验证。

到目前为止,这一切都很好。 ADAL JS 将用户带到 Azure 登录页面,一旦用户通过身份验证,就会发出 OAuth2 令牌。然后,此 JWT 令牌作为承载令牌与所有 API 调用一起发送,我们有自己的声明转换过程,用于将来自 Azure 的传入声明映射到我们的应用程序声明。

我们尝试通过 AD 组在声明转换过程中指定单个用户,而不是指定单个用户。这允许我们的客户在他们的 AD 中拥有安全组,然后我们的应用程序将使用它来映射到正确的应用程序声明。

问题

我们收到的 JWT 令牌不包含 groups 属性,尽管在 AAD 应用程序清单中已将 groupMembershipClaims 设置为 SecurityGroup。从那以后,我在 this tweet from Vittorio 中读到

The implicit grant will NOT send those claims, as it returns the token in the querystring - it's easy to blow past max length

经过进一步调查,我还发现 this Whosebug answer from Vittorio 上面写着

I verified and in the implicit grant case you will receive groups always via the overage claim. Please refer to https://github.com/AzureADSamples/WebApp-GroupClaims-DotNet/tree/master/WebApp-GroupClaims-DotNet - it will show you how to process the overage claim to retrieve groups.

我查看了 JWT 令牌,它不包含任何超额声明(由 _claim_names_claim_sources 标识)。我绝对是 Azure AD 中两个组的成员。

关于是否可以在隐式授权令牌中获取组信息(直接或间接),我现在似乎也有两个相互矛盾的陈述。

问题 1:我是否应该获得可用于获取团体信息的超龄索赔?如果是这样,我是否需要做任何事情来确保将索赔发送给我?

图表API

我是否可以通过 link 向图表 API 中的用户提出超额索赔,或者我是否必须手动制作 link 以获得用户组,我我仍然有点不确定我如何使用图表进行身份验证 API。

收到带有不记名令牌(来自 ADAL JS)的请求后,我需要从后端联系图表 API。

问题 2:我可以向图 API 发送相同的不记名令牌以读取该用户的目录信息吗?或者我是否需要直接从我的应用程序到应用程序上下文中的图形 API 租户而不是用户进行身份验证?

对这里的混乱表示歉意。我会仔细检查有关超额的声明,但无论如何 - 为了快速解除阻塞,我们假设您需要在没有超额声明帮助的情况下手动获取组。您不能重复使用您发送到 Web API 的令牌。该令牌仅限于您的应用程序,任何其他接收者都会(或应该)拒绝它。好消息是,您的后端可以通过该流程请求适用于 Graph 的新令牌的流程很容易实现。请参阅 https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet - 您的案例中的详细信息有点不同(您的网站 API 的受众 == 您的应用程序的 clientid)但涉及的拓扑和 code/calls 正是相同的。喂!五、