我正在对Azure Active Directory的web api用户进行身份验证。 现在我想获得该用户所属的组列表。
我更改了应用程序清单以包含
"groupMembershipClaims": "All",
但所有这一切都是添加声明hasGroups但没有组名。
我在门户网站中为我的应用授予了Windows Azure Active Directory的所有(8)委托权限。
答案 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
。你可以在这里阅读更多相关信息:
然后,您可以像这样访问用户组:
[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中的组。