我们正在开发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中读到了
隐式授权不会发送这些声明,因为它会在查询字符串中返回令牌 - 它很容易超过最大长度
经过进一步调查,我还发现this StackOverflow answer from Vittorio表示
我已经验证并且在隐式授权案例中,您将始终通过超额索赔接收组。请参阅https://github.com/AzureADSamples/WebApp-GroupClaims-DotNet/tree/master/WebApp-GroupClaims-DotNet - 它将向您展示如何处理超额索赔以检索群组。
我查看了JWT令牌,但不包含任何超额声明(由_claim_names
和_claim_sources
标识)。我绝对是Azure AD中两个组的成员。
我现在似乎还有两个相互矛盾的陈述,即是否有可能在隐式授权令牌中获取组信息(无论是直接还是间接)。
问题1:我是否应该获得可用于获取群组信息的超额索赔?如果是这样,我是否需要做任何事情以确保将索赔发送给我?
我是否可以通过图API中的用户链接获得超额索赔,或者我是否必须手动制作链接以获取用户的群组,我仍然有点不确定我是怎么回事使用图API进行身份验证。
我需要在收到带有持票令牌的请求后(来自ADAL JS)从后端联系图API。
问题2:我是否可以向图API发送相同的承载令牌以读取该用户的目录信息?或者我是否需要在应用程序的上下文中直接从我的应用程序向图API租户进行身份验证而不是用户?
答案 0 :(得分:4)
对这里的混乱道歉。我将仔细检查有关超额的声明,但无论如何 - 为了快速解锁您,我们假设您需要手动获取组,而无需超额索赔。您无法重复使用发送到Web API的令牌。该令牌的范围限定在您的应用中,任何其他收件人都会(或应该)拒绝它。好消息是,后端可以为Graph请求新标记的流程很容易实现。请参阅https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet - 您的案例中的详细信息有点不同(您的网络API的受众群体= =您的应用的clientid)但拓扑和所涉及的代码/调用完全相同。 HTH!诉