如何通过C#和GraphServiceClient获取当前登录用户的应用角色
获取当前用户在MyApp中的自定义应用角色
要通过GraphServiceClient拿到用户在MyApp里的Editor/Viewer角色,核心是把用户的AppRoleAssignments和MyApp的应用角色定义做关联,具体步骤如下:
1. 先获取MyApp的应用角色映射
首先查询MyApp的服务主体,提取自定义应用角色的ID与名称对应关系:
// 替换为你的MyApp的Client ID(在Entra ID应用注册页面可查) string myAppClientId = "your-myapp-client-id"; // 查询MyApp服务主体,仅获取appRoles字段 var myAppServicePrincipal = await gs.ServicePrincipals .Request() .Filter($"appId eq '{myAppClientId}'") .Select("appRoles") .GetAsync(); // 构建角色ID到名称的字典 var appRoleIdToNameMap = myAppServicePrincipal.FirstOrDefault()?.AppRoles .ToDictionary(role => role.Id.ToString(), role => role.DisplayName);
2. 筛选用户在MyApp中的角色分配并匹配名称
从用户的AppRoleAssignments中筛选出属于MyApp的条目,再用上述字典匹配角色名称:
// 获取当前用户的所有应用角色分配 var allUserAssignments = await gs.Me.AppRoleAssignments.Request().GetAsync(); // 筛选资源为MyApp的角色分配(用ResourceId替代DisplayName更准确,避免名称重复) // 替换为MyApp服务主体的Object ID string myAppObjectId = "your-myapp-object-id"; var myAppUserAssignments = allUserAssignments .Where(assignment => assignment.ResourceId.ToString() == myAppObjectId); // 匹配并收集角色名称 var userMyAppRoles = new List<string>(); foreach (var assignment in myAppUserAssignments) { if (appRoleIdToNameMap.TryGetValue(assignment.AppRoleId.ToString(), out var roleName)) { userMyAppRoles.Add(roleName); } } // userMyAppRoles 即为当前用户在MyApp中的自定义角色列表(如Editor、Viewer)
注意事项
- 确保GraphServiceClient拥有Application.Read.All(读取服务主体信息)和User.Read(读取当前用户信息)权限,需在Entra ID应用注册的“API权限”中添加并完成管理员同意。
- 用
ResourceId筛选比ResourceDisplayName更可靠,避免不同应用重名导致的错误。
内容的提问来源于stack exchange,提问作者timanderson
相关产品推荐
相关产品推荐

