我如何获得当前登录用户的Azure广告组,而不需要域管理员授予我的应用程序任何权限?

我如何获得当前登录用户的Azure广告组,而不需要域管理员授予我的应用程序任何权限?,azure,azure-active-directory,microsoft-graph-api,Azure,Azure Active Directory,Microsoft Graph Api,更具体地说:我有一个小的Azure广告,我在其中注册了我的应用程序。该应用程序被标记为多租户,因为我希望人们能够使用自己的公司帐户登录到它。我希望通过利用不需要管理员同意的委托访问权限来获得登录用户的组成员资格,因为我不希望新AAD租户的入职流程要求管理员授予我的应用程序特殊权限 以下是我尝试过的: 直接在令牌中获取信息 通过将我的应用程序清单中的groupMembershipClaims字段配置为All,如文档所示。我可以获得我令牌中的组。这可以在没有任何管理员同意的情况下完成。事实上,唯一需

更具体地说:我有一个小的Azure广告,我在其中注册了我的应用程序。该应用程序被标记为多租户,因为我希望人们能够使用自己的公司帐户登录到它。我希望通过利用不需要管理员同意的委托访问权限来获得登录用户的组成员资格,因为我不希望新AAD租户的入职流程要求管理员授予我的应用程序特殊权限

以下是我尝试过的:

直接在令牌中获取信息 通过将我的应用程序清单中的
groupMembershipClaims
字段配置为
All
,如文档所示。我可以获得我令牌中的组。这可以在没有任何管理员同意的情况下完成。事实上,唯一需要的授权是
openid
ie登录用户

然而,这种方法限制了我为少于200个组的用户获取组。否则,我将一个也得不到,取而代之的是获得Azure Graph API的端点,在那里我可以检索它们

这就引出了第二种方法

使用MicrosoftGraphAPI 可悲的是,旧的和新的似乎都需要管理员同意的权限才能获得这些组

呼叫的文档说明,我们应该能够获得委派的
用户。Read
权限进行此呼叫。但是,这不起作用,事实上,
Directory.Read.All
是实际起作用的最低权限。请参阅文档

查看文档的历史,我们可以看到这曾经被认为是一个问题,而不是文档问题。进一步回顾似乎意味着至少需要
User.Read
Group.Read

这让我有点困了。理想情况下,我更愿意在所有情况下使用graph api,而不仅仅是在200多个情况下,因为如果不这样,我的代币对于某些USCASE来说可能会变得太大,尽管微软施加了限制。但是我不确定在这种查询中需要管理员同意的实际意图是什么

有人有其他想法吗?

如果没有Azure AD directory管理员同意委托权限目录,当前(2019-03-20)无法获取登录用户的组成员信息。Read.All。(尽管默认情况下可能仍需要管理员同意,但仍有计划支持此场景的较低特权权限。)

您不应在构建应用程序时假设所有用户都可以使用您的应用程序,因为您只请求当前默认情况下用户同意的权限。许多组织完全禁用用户同意,您可以预期,将来每个组织都会更改哪些用户可以同意哪些权限

我的建议如下:

  • 在发送用户登录之前,请澄清其组织的政策可能不允许他们登录(如果是这种情况,建议他们联系IT团队)。(将来,面对“对不起,您不允许同意”错误的用户将有更多选项…)
  • 考虑只从请求User.Read(和groups声明)开始,然后在应用程序的体验中只“升级”到Directory.Read.All。这将增加用户至少能够登录的可能性(尽管不能保证),并允许您为他们提供更好的指导,指导他们如何要求IT团队审查您的应用程序

  • 还有一些额外的指导:

    您在应用程序中使用的用户需要阅读整个目录,以验证用户是否在其中。这就是老式广告和LDAP的工作原理。即使功能被禁用,作为经过身份验证的用户,您通常也可以启动PowerShell或Javascript并查看所有用户。感谢您的详细解释。您是否对当前的不一致性有任何想法,即意图似乎是需要管理员同意,但在大多数情况下,组声称可以解决这一问题?我认为主要区别之一是Microsoft Graph中的大多数API(例如getMemberGroups)实际上会返回完整的组对象,包括很多关于组的细节(例如,那个绝密项目的名称等),这是一个很好的理由,对于其他组相关的api调用来说可能是正确的,但目前getMemberGroups实际上只是这样做