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

关于Microsoft Graph中/users端点Webhooks订阅格式不可用的技术问询

用Microsoft Graph Webhooks + Azure Functions实现用户入职/变更自动化流程

2017年参加Ignite大会后,我就对Microsoft Graph Webhooks和Azure Functions结合的潜力特别感兴趣——这不就是身份管理场景里自动化用户生命周期的完美组合吗?最近终于抽时间动手探索了,从身份管理的视角出发,目标就是用这套方案来响应并处理用户入职、信息变更这类流程,下面分享下我的实操步骤:

第一步:配置Microsoft Graph Webhooks用户事件订阅

首先得从Graph的beta端点入手,因为针对用户的部分高级事件订阅目前还在beta阶段。要订阅/users的Webhooks,你需要先完成几个基础操作:

  • 注册一个Azure AD应用,给它分配Directory.Read.All和User.Read.All的应用权限(记得需要管理员同意)
  • 构造订阅请求,核心参数要注意这几个:
    • changeType:指定要监听的事件,比如created(用户入职)、updated(用户信息变更)
    • notificationUrl:填Azure Functions的触发URL,用来接收Graph推送的事件通知
    • resource:设为/users,表示监听用户对象的变化
    • expirationDateTime:订阅有效期最长3天,之后需要手动续期

示例PowerShell请求代码:

$headers = @{
    "Authorization" = "Bearer $accessToken"
    "Content-Type" = "application/json"
}

$body = @{
    changeType = "created,updated"
    notificationUrl = "https://your-function-app.azurewebsites.net/api/GraphWebhookTrigger"
    resource = "/users"
    expirationDateTime = (Get-Date).AddDays(3).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ")
    clientState = "random-verify-string-123"
} | ConvertTo-Json

Invoke-RestMethod -Method Post -Uri "https://graph.microsoft.com/beta/subscriptions" -Headers $headers -Body $body

第二步:搭建Azure Functions处理Webhook通知

接下来要创建一个HTTP触发的Azure Function来接收并处理Graph的通知:

  • 先处理Graph的验证请求:创建订阅时,Graph会往notificationUrl发送带validationToken的GET请求,你的Function必须直接返回这个token,否则订阅会失败
  • 验证通过后,后续的事件通知会以POST请求发送,请求体里包含用户变更的关键信息,你可以在这里编写业务逻辑:比如用户入职时自动分配邮箱、添加到指定组;用户信息变更时同步到HR系统等

示例C# Function代码:

[FunctionName("GraphWebhookTrigger")]
public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    log.LogInformation("Received Graph Webhook notification");

    // 处理订阅验证请求
    string validationToken = req.Query["validationToken"];
    if (!string.IsNullOrEmpty(validationToken))
    {
        log.LogInformation("Handling validation request");
        return new OkObjectResult(validationToken);
    }

    // 处理实际事件通知
    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
    var notifications = JsonConvert.DeserializeObject<NotificationPayload>(requestBody);
    
    foreach (var notification in notifications.Value)
    {
        switch (notification.ChangeType)
        {
            case "created":
                log.LogInformation($"New user added: {notification.Resource}");
                // 这里添加入职流程逻辑:调用Graph API获取用户详情、分配权限等
                break;
            case "updated":
                log.LogInformation($"User info updated: {notification.Resource}");
                // 这里添加信息变更同步逻辑
                break;
        }
    }

    return new OkResult();
}

// 用于反序列化的实体类
public class NotificationPayload
{
    public List<Notification> Value { get; set; }
}

public class Notification
{
    public string ChangeType { get; set; }
    public string Resource { get; set; }
    public string ResourceData { get; set; }
}

第三步:优化与扩展建议

  • 订阅续期:因为Graph Webhook订阅最多3天有效期,可以再写一个定时触发的Azure Function,定期调用Graph API续期订阅
  • 错误处理:添加重试机制处理通知接收失败的情况,同时完善日志记录方便排查问题
  • 权限最小化:生产环境不要给Azure AD应用分配过高权限,根据实际需求调整权限范围

这段探索下来,最大的感受就是这套组合确实能极大简化身份管理里的重复流程,把人工操作变成自动化响应,效率提升特别明显。

内容的提问来源于stack exchange,提问作者Olof Ottensten

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:35:40