获取Azure AD用户在声明中所属的组列表

时间:2016-02-11 15:27:19

标签: .net azure-active-directory adal azure-ad-graph-api

我正在对Azure Active Directory的web api用户进行身份验证。 现在我想获得该用户所属的组列表。

我更改了应用程序清单以包含

"groupMembershipClaims": "All",

但所有这一切都是添加声明hasGroups但没有组名。

我在门户网站中为我的应用授予了Windows Azure Active Directory的所有(8)委托权限。

4 个答案:

答案 0 :(得分:8)

我做到了这一点。

让我们将我的Azure AD应用称为“AD-App”。

广告-应用

其他应用程序的权限设置为;

Windows Azure Active Directory。

应用程序权限:0。

委派权限2 (“读取目录数据”,“登录并阅读用户个人资料”。

清单具有以下设置:

“groupMembershipClaims”:“SecurityGroup”

后端API

以下是我返回用户组的方法。您是否发送了用户ID,如果没有,则使用声明中的ID。 Id表示“objectIdentifier”。

        public static IEnumerable<string> GetGroupMembershipsByObjectId(string id = null)
    {
        if (string.IsNullOrEmpty(id))
            id = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

        IList<string> groupMembership = new List<string>();
        try
        {
            ActiveDirectoryClient activeDirectoryClient = ActiveDirectoryClient;
            IUser user = activeDirectoryClient.Users.Where(u => u.ObjectId == id).ExecuteSingleAsync().Result;
            var userFetcher = (IUserFetcher)user;

            IPagedCollection<IDirectoryObject> pagedCollection = userFetcher.MemberOf.ExecuteAsync().Result;
            do
            {
                List<IDirectoryObject> directoryObjects = pagedCollection.CurrentPage.ToList();
                foreach (IDirectoryObject directoryObject in directoryObjects)
                {
                    if (directoryObject is Group)
                    {
                        var group = directoryObject as Group;
                        groupMembership.Add(group.DisplayName);
                    }
                }
                pagedCollection = pagedCollection.GetNextPageAsync().Result;
            } while (pagedCollection != null);

        }
        catch (Exception e)
        {
            ExceptionHandler.HandleException(e);
            throw e;
        }

        return groupMembership;
    }

我不能告诉你这是不是通过最佳实践来完成,但它对我有用。

答案 1 :(得分:1)

如果一个用户拥有超过150个组,那么只有图表API的链接就像&#34;图表:链接&#34;返回,而不是组。这是出于性能原因。然后,您需要调用Graph API(MS Graph API - 最新版本,或AD Graph API - 旧版本)来遍历所有组。

答案 2 :(得分:0)

您为自己的应用授予了哪些权限?您需要明确请求读取组的能力(请参阅https://msdn.microsoft.com/en-us/library/azure/ad/graph/howto/azure-ad-graph-api-permission-scopes中的group.read.all)。截至今天,这些权限只能由管理员同意。

答案 3 :(得分:0)

以下是我们在项目中所做的事情:

登录https://portal.azure.com并点击Azure Active Directory - &gt; App registrations - &gt; <YOUR_APP> - &gt; Manifest并将groupMembershipClaims设置为7。你可以在这里阅读更多相关信息:

https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-application-manifest

然后,您可以像这样访问用户组:

[Route("api/[controller]")]
[ApiController]
public class CurrentUserController : ControllerBase
{
    [HttpGet("groups")]
    [ProducesResponseType(typeof(IEnumerable<ClaimsViewModel>), (int)HttpStatusCode.OK)]
    public IActionResult Groups()
    {
        return Ok(User.Claims.Where(claim => claim.Type == "groups").Select(c => new ClaimsViewModel() { Type = c.Type, Value = c.Value }));
    }
}

public class ClaimsViewModel
{
    public string Type { get; set; }
    public string Value { get; set; }
}

使用伪对象ID的示例响应:

[{"type":"groups","value":"12fef9e0-4b73-425d-91b7-30c027aa4945"},{"type":"groups","value":"12fef9e0-4b73-425d-91b7-30c027aa4946"},{"type":"groups","value":"12fef9e0-4b73-425d-91b7-30c027aa4947"},{"type":"groups","value":"12fef9e0-4b73-425d-91b7-30c027aa4948"},{"type":"groups","value":"12fef9e0-4b73-425d-91b7-30c027aa4949"}]

根据这些ID,您可以识别AD中的组。