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

如何在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为例,实现枚举即将过期的服务主体:

  1. 安装NuGet包:Microsoft.Graph 和 Azure.Identity
  2. 编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:02:05