AAD Graph迁移至MS Graph:用户组Claims无法获取的权限排查
AAD Graph迁移MS Graph后无法获取用户组的问题解决
一、先排查权限配置的核心问题
从你提供的权限截图来看,重点确认这两点:
- 权限类型要匹配登录场景:你是用户登录的委托访问场景,必须添加委托权限而非应用权限。如果当前配置的
Group.Read.All是应用权限,它仅适用于后台服务调用,不会出现在用户的ID Token中,自然拿不到组信息。建议替换为GroupMember.Read.All(委托权限),这是专门用于获取用户所属组的权限。 - 权限的同意状态:
GroupMember.Read.All属于需要管理员同意的权限,得确认租户管理员已经为你的应用完成权限同意操作,否则用户登录时无法获取该权限,也就查不到组数据。
二、配置组声明让ID Token返回组信息
默认情况下,Azure AD不会自动将用户组信息放入ID Token,必须手动配置:
- 进入Azure AD应用注册页面,找到你的应用,点击令牌配置
- 点击添加组声明,选择以下配置:
- 组类型:根据需求选安全组或所有组
- 声明格式:推荐选组ID,避免组名称重复导致的冲突
- 务必勾选在ID令牌中发出
- 保存配置后让用户重新登录,就能在
context.AuthenticationTicket.Identity.Claims中找到groups类型的声明了
三、检查代码是否过滤了组声明
确认你的UseOpenIdConnectAuthentication配置没有过滤groups声明,示例配置如下:
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { // 其他基础配置... TokenValidationParameters = new TokenValidationParameters { RoleClaimType = ClaimTypes.Role, NameClaimType = ClaimTypes.Name // 不要添加过滤声明的规则,确保groups能被保留 }, Notifications = new OpenIdConnectAuthenticationNotifications { SecurityTokenValidated = context => { // 可以先打印所有声明,确认groups是否存在 foreach (var claim in context.AuthenticationTicket.Identity.Claims) { Debug.WriteLine($"{claim.Type}: {claim.Value}"); } return Task.CompletedTask; } } });
四、备选方案:直接调用MS Graph API获取组
如果不想依赖ID Token的组声明,也可以在用户登录后,用用户的访问令牌调用MS Graph接口获取组列表:
var graphClient = new GraphServiceClient(new DelegateAuthenticationProvider(async requestMessage => { var accessToken = context.AuthenticationTicket.Identity.FindFirst("access_token").Value; requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); })); var userGroups = await graphClient.Me.MemberOf.Request().GetAsync();
这种方式同样需要确保应用已配置GroupMember.Read.All委托权限,且完成了管理员同意。
内容的提问来源于stack exchange,提问作者Vigneash Selvaraj
相关产品推荐
相关产品推荐

