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

如何通过Microsoft Graph API查询应用注册客户端密钥到期时间

解决方案

问题原因

你无法获取密钥相关信息不是Microsoft Graph SDK不支持,是两个配置/代码问题导致:

  • 调用接口的身份没有足够的应用权限
  • 默认查询不会返回密码/证书凭据这类敏感字段,需要显式指定返回字段

操作步骤

  1. 配置API权限
    在Azure Portal中找到你当前用来调用Graph接口的应用注册,为其添加Microsoft Graph > 应用权限 > Application.Read.All,完成后必须点击「授予管理员同意」使权限生效。

  2. 修改查询代码
    调用Applications接口时显式指定需要返回的passwordCredentials(客户端密钥)和keyCredentials(证书凭据)字段,修改后的代码示例如下:

var scopes = new string[] { "https://graph.microsoft.com/.default" };

// 配置MSAL机密客户端
var confidentialClient = ConfidentialClientApplicationBuilder
    .Create(clientId)
    .WithAuthority($"https://login.microsoftonline.com/xxx-e95b-4ad0-a4fb-xxx/v2.0")
    .WithClientSecret(secret)
    .Build();

// 构造Graph客户端
GraphServiceClient graphServiceClient =
    new GraphServiceClient(new DelegateAuthenticationProvider(async (requestMessage) => {
        var authResult = await confidentialClient
            .AcquireTokenForClient(scopes)
            .ExecuteAsync();
        requestMessage.Headers.Authorization =
            new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
    })
);

// 关键:显式指定返回密码凭据、证书凭据字段
var applications = await graphServiceClient.Applications
    .Request()
    .Select("id,displayName,passwordCredentials,keyCredentials")
    .GetAsync();

// 遍历所有应用检查密钥到期时间
while (applications.Count > 0)
{
    foreach (var app in applications)
    {
        // 输出应用名称
        Console.WriteLine($"应用名称:{app.DisplayName}");
        // 遍历所有客户端密钥检查到期时间
        foreach (var pwdCred in app.PasswordCredentials)
        {
            Console.WriteLine($"密钥ID:{pwdCred.KeyId},到期时间:{pwdCred.EndDateTime},是否即将到期:{pwdCred.EndDateTime < DateTimeOffset.UtcNow.AddDays(30)}");
        }
        
        // 如果需要检查证书到期,同理遍历app.KeyCredentials
        foreach (var keyCred in app.KeyCredentials)
        {
            Console.WriteLine($"证书ID:{keyCred.KeyId},到期时间:{keyCred.EndDateTime},是否即将到期:{keyCred.EndDateTime < DateTimeOffset.UtcNow.AddDays(30)}");
        }
    }
    // 处理分页
    if (applications.NextPageRequest != null)
    {
        applications = await applications.NextPageRequest.GetAsync();
    }
    else
    {
        break;
    }
}

调试参考

你之前的调试结果如下,修改后就能在应用对象中看到PasswordCredentials属性有值:
调试结果截图

内容的提问来源于stack exchange,提问作者Thomas Segato

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:36:03