如何在Azure Function中获取ServicePrincipal信息并识别即将过期的凭据?
使用Azure Function系统托管身份访问Microsoft Graph API枚举即将过期的服务主体凭据
核心方案概述
直接借助Azure Function的系统分配托管身份访问Microsoft Graph API,无需手动配置客户端凭证流,权限授予可通过Azure Portal完成,无需维护PowerShell脚本。以下是具体实现步骤及代码示例:
1. 启用Azure Function的系统分配托管身份
在Azure Portal的Function App页面操作:
- 进入「身份」选项卡,切换到「系统分配」标签
- 将状态设为「开」并保存,系统会自动为该Function创建托管身份
2. 为托管身份授予Microsoft Graph应用权限
全程在Azure Portal完成,无需PowerShell:
- 搜索并进入「Microsoft Graph」服务页面
- 进入「权限」选项卡,点击「添加权限」
- 选择「应用权限」,搜索并添加所需权限(遵循最小权限原则):
Application.Read.All:枚举服务主体的基础权限Application.ReadWrite.All(可选):若需对过期凭据执行后续操作
- 添加完成后,点击「授予管理员同意」完成权限配置
3. 在Azure Function中使用Microsoft Graph SDK调用API
以.NET为例,实现枚举即将过期的服务主体:
- 安装NuGet包:
Microsoft.Graph和Azure.Identity - 编写Function代码:
using Microsoft.Azure.Functions.Worker; using Microsoft.Extensions.Logging; using Microsoft.Graph; using Azure.Identity; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; public class ExpiringServicePrincipalsFunction { private readonly GraphServiceClient _graphClient; public ExpiringServicePrincipalsFunction() { // 基于系统托管身份创建Graph客户端 var credential = new ManagedIdentityCredential(); _graphClient = new GraphServiceClient(credential, new[] { "https://graph.microsoft.com/.default" }); } [Function("ExpiringServicePrincipals")] public async Task Run([TimerTrigger("0 0 1 * * *")] TimerInfo myTimer, FunctionContext context) { var logger = context.GetLogger<ExpiringServicePrincipalsFunction>(); logger.LogInformation("开始检查即将过期的服务主体凭据"); // 定义过期阈值(示例为未来30天内) var expirationThreshold = DateTimeOffset.UtcNow.AddDays(30); // 查询并筛选即将过期的服务主体 var servicePrincipals = await _graphClient.ServicePrincipals .Request() .Filter("endDateTime le @expirationThreshold") .Select("id, displayName, passwordCredentials, keyCredentials") .Expand("passwordCredentials, keyCredentials") .WithParameters(new Dictionary<string, object> { { "@expirationThreshold", expirationThreshold.ToString("o") } }) .GetAsync(); foreach (var sp in servicePrincipals) { var expiringPasswords = sp.PasswordCredentials?.Where(p => p.EndDateTime <= expirationThreshold); var expiringKeys = sp.KeyCredentials?.Where(k => k.EndDateTime <= expirationThreshold); if (expiringPasswords?.Any() == true || expiringKeys?.Any() == true) { logger.LogWarning($"服务主体 {sp.DisplayName} (ID: {sp.Id}) 存在即将过期的凭据"); // 可在此添加通知逻辑(如邮件、Teams消息推送) } } logger.LogInformation("服务主体凭据过期检查完成"); } }
相关官方文档参考
- Azure Function系统托管身份配置文档:详细说明系统分配身份的启用、管理流程
- Microsoft Graph应用权限配置文档:讲解如何为服务主体(含托管身份)授予Graph应用权限
- Microsoft Graph ServicePrincipals API文档:包含服务主体及凭据的查询筛选、字段返回等细节
- Azure.Identity库文档:介绍如何通过托管身份凭据访问Azure服务(含Microsoft Graph)
内容的提问来源于stack exchange,提问作者Neutrino
相关产品推荐
相关产品推荐

