通过Graph API获取应用所有者时无法访问DisplayName字段问题
无法获取Graph API返回的应用所有者DisplayName字段值问题排查
你遇到的问题核心在于应用所有者的类型不一定是User,以及可能的权限、类型判断问题,以下是具体排查和解决步骤:
1. 先确认所有者的实际类型
应用注册的所有者可以是用户(User)、服务主体(ServicePrincipal)、组(Group)等多种类型,你直接强转成Microsoft.Graph.Models.User可能并不匹配实际的所有者类型,导致DisplayName字段为空。
先添加日志输出所有者的类型:
var firstOwner = owners.Value[0]; _logger.LogInformation($"所有者类型: {firstOwner.ODataType}");
输出的ODataType会是类似#microsoft.graph.user、#microsoft.graph.servicePrincipal或#microsoft.graph.group的值,根据实际类型再做对应的转换:
if (firstOwner.ODataType == "#microsoft.graph.user") { var userOwner = (Microsoft.Graph.Models.User)firstOwner; _logger.LogInformation($"用户所有者名称: {userOwner.DisplayName}"); } else if (firstOwner.ODataType == "#microsoft.graph.servicePrincipal") { var spOwner = (Microsoft.Graph.Models.ServicePrincipal)firstOwner; _logger.LogInformation($"服务主体所有者名称: {spOwner.DisplayName}"); } else if (firstOwner.ODataType == "#microsoft.graph.group") { var groupOwner = (Microsoft.Graph.Models.Group)firstOwner; _logger.LogInformation($"组所有者名称: {groupOwner.DisplayName}"); }
2. 验证权限是否足够
虽然你能获取到所有者的Id,但如果权限不足,Graph API可能不会返回DisplayName字段。确保你的应用已配置以下权限之一(根据你的授权类型选择):
- 委派权限:
User.ReadBasic.All、Directory.Read.All - 应用权限:
User.Read.All、Directory.Read.All
并且已经完成权限的同意流程。
3. 排查Select参数是否生效
暂时移除Select参数,获取所有者的所有字段,确认DisplayName是否存在:
var owners = await graphServiceClient.Applications["MyId"].Owners.GetAsync();
如果这样能拿到DisplayName,说明可能是Select参数的写法问题(不过你的写法符合Graph SDK v5的规范,大概率不是这个原因),可以再重新添加Select参数测试。
4. 确认Graph SDK版本
确保你使用的是最新版的Microsoft.Graph NuGet包,旧版本可能存在字段序列化或API调用逻辑的问题。
内容的提问来源于stack exchange,提问作者DonDavid12
相关产品推荐
相关产品推荐

