背景
我们正在Azure中开发一个具有AngularJS前端和Web API后端的多租户SaaS产品 . 我们使用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中两个组的成员 .
我现在似乎还有两个相互矛盾的陈述,即是否有可能在隐式授权令牌中获取组信息(无论是直接还是间接) .
Question 1: Should I get an overage claim that I can use to get group information? If so, do I need to do anything to ensure that claim gets sent to me?
图谱API
我是否可以通过图API中的用户链接获得超额索赔,或者我是否必须手动创建链接以获取用户的组,我仍然不确定如何使用图API进行身份验证 .
我需要在收到带有承载令牌的请求(来自ADAL JS)后从后端联系图API .
Question 2: Can I send the same bearer token to the graph API to read that user's directory information? Or do I need to authenticate directly from my application to the graph API tenant in the context of the application rather than the user?
1 回答
为这里的混乱道歉 . 我将仔细检查有关超额的声明,但无论如何 - 为了快速解锁您,我们假设您需要手动获取组而无需超额索赔 . 您无法重复使用发送到Web API的令牌 . 该令牌的范围限定在您的应用中,任何其他收件人都会(或应该)拒绝它 . 好消息是,后端可以为Graph请求新标记的流程很容易实现 . 请参阅https://github.com/AzureADSamples/WebAPI-OnBehalfOf-DotNet - 您的案例中的详细信息有点不同(您的网络API具有您应用的受众== clientid)但拓扑和所涉及的代码/调用完全相同 . HTH! V.