【问题标题】:Programatically get users group and role from Azure AD以编程方式从 Azure AD 获取用户组和角色
【发布时间】:2019-07-18 21:57:21
【问题描述】:

我是 azure AD 的新手。

我有一个第三方 API,它给了我一个 userId。我编写了一个 .NET Core API,它应该采用这个用户 ID 并获取该特定用户的角色和组。

我已阅读有关 microsoft graph API 的信息。不确定这在我的场景中是否有用。

还有其他方法可以以编程方式访问 AD 用户的角色和组。

【问题讨论】:

  • Microsoft Graph API 在您的情况下会很有用。要在知道用户 ID 后获取用户的组,可以使用此 API..POST https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/getMemberGroups。这是文档的链接docs.microsoft.com/en-us/graph/api/…
  • 请澄清一下您正在寻找的角色。当您说角色时,您是指Application Role,即分配给您的特定应用程序的用户,还是您的意思是Directory Role,即分配给Azure AD 的用户?
  • /users/id/memberOf 实际上会返回目录角色和组,所以这可能很有用
  • getMemberGroups 也是我所看到的。但是我如何获取和传递访问令牌(我相信的不记名令牌)?
  • 您可以使用 MSAL 或 ADAL 库来获取令牌.. 并使用 Microsoft Graph Client Library for .NET 进行调用.. 就要使用的 API 而言.. getMemberGroups 和 memberOf是很好的建议,它们之间略有不同。我将尝试进一步解释一些细节

标签: azure azure-active-directory microsoft-graph-api


【解决方案1】:

使用哪个 API 来获取组和角色信息

首先,Microsoft Graph API 是您获取所需信息的最佳选择。

哪个确切的 API 最适合您取决于您​​的场景(a.您需要顶级直接成员资格还是传递检查?b.您只需要安全组还是 O365 组?),所以您是最好的判断者.

我将在这里列出其中的 3 个,您应该有一些想法可供选择。

  • memberOf -

    获取用户是其直接成员的组和目录角色。

    注意:只有直接成员资格对此很重要,检查是不传递(即用户必须是该组的直接成员才能返回该组。如果用户是组的成员1 ,但 group1 是 group2 的成员,则不会返回 group2。这种行为可能在某些情况下可以,但在其他情况下则不行)

    GET /users/{id | userPrincipalName}/memberOf
    
  • getMemberGroups

    POST /users/{id | userPrincipalName}/getMemberGroups
    

    返回用户所属的所有组。检查这个是否是Transitive,因此您可以放心,所有组都将返回。最多 2046 个作为 1 个请求的一部分返回。它也适用于 O365 组,您可以使用参数过滤到 SecurityEnabled 组

  • getMemberObjects

    返回用户所属的所有组、目录角色和管理单元。检查再次传递

实现和代码示例..如何获取token、调用API等

  • 获取令牌以进行身份​​验证

    您应该使用 MSAL 或 ADAL 库,具体取决于您将 MSAL 用于 v2 和 ADAL 用于 v1。使用这些库不是强制性的,但建议使用,因为它们会遵循最佳实践并为您完成繁重的工作。

  • 与 Microsoft Graph API 端点交互

    由于您使用 .NET 编写代码,因此可以使用 Microsoft Graph Client Library for .NET (SDK)。同样,使用客户端库不是强制性的,但它会使您的代码更具声明性并且方便。如果需要,您始终可以使用 HttpClient 并直接访问 REST 端点。

  • 代码示例

    Microsoft Graph Connect Sample for ASP.NET Core 2.1

    重要部分.. 查看 GraphService.cs 文件以获取获取用户信息的方法,例如

      // Load user's profile in formatted JSON.
        public static async Task<string> GetUserJson(GraphServiceClient graphClient, string email, HttpContext httpContext)
            {
                if (email == null) return JsonConvert.SerializeObject(new { Message = "Email address cannot be null." }, Formatting.Indented);
    
                try
                {
                    // Load user profile.
                    var user = await graphClient.Users[email].Request().GetAsync();
                    return JsonConvert.SerializeObject(user, Formatting.Indented);
                }
    

    注意:该示例使用委托权限。您可能需要直接使用应用程序权限或代表流程(如果您想在用户的上下文中执行此操作),因为您提到您的是一个被调用的 API。此外,这只是示例之一,您应该查看这些示例以了解如何使用 SDK,但是一旦您开始进一步研究 Microsoft Graph API 和客户端库文档,就有许多可用的示例。如果我找到更接近您的确切场景的示例,我会更新答案。

【讨论】:

  • 谢谢你的想法,我会试试这些并告诉你。
  • 您有没有用户登录即可获取信息的示例?所以我不希望用户登录以获取组信息。正如我所提到的,此 API 由第三方应用程序使用。我正在努力开始。我提出了另一个问题,stackoverflow.com/questions/55006706/… 如果您有任何想法,请回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-14
  • 2015-11-11
  • 1970-01-01
  • 2018-09-03
  • 1970-01-01
  • 2017-11-29
相关资源
最近更新 更多