You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:20:07