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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 11:05:12