如何通过Microsoft Graph API查询应用注册客户端密钥到期时间
解决方案
问题原因
你无法获取密钥相关信息不是Microsoft Graph SDK不支持,是两个配置/代码问题导致:
- 调用接口的身份没有足够的应用权限
- 默认查询不会返回密码/证书凭据这类敏感字段,需要显式指定返回字段
操作步骤
配置API权限
在Azure Portal中找到你当前用来调用Graph接口的应用注册,为其添加Microsoft Graph > 应用权限 > Application.Read.All,完成后必须点击「授予管理员同意」使权限生效。修改查询代码
调用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
相关产品推荐
相关产品推荐

