无法接收Microsoft Graph变更通知:Azure AD用户删除事件无响应
让我帮你排查一下为什么没收到用户删除的通知,整理了几个常见问题点,你可以逐一检查:
1. 先确认时间计算的小笔误(虽然后续响应时间正常,但还是核对下)
看你代码里计算三天后时间的片段:
const threeDaysLater = new Date(now.getTime() + 3 * 24 * 58 * 60 * 1000);
这里的58应该是60吧?不过从你返回的expirationDateTime来看是正确的,可能是输入时的手误,但如果实际运行代码确实是58的话,订阅会提前过期,这点要确认。
2. 软删除和硬删除的事件触发逻辑不一样
Azure AD的用户删除分两种情况,对应不同的事件:
- 软删除:用户被移到回收站,实体并没有真正删除,只是
accountEnabled设为false、新增deletedDateTime属性,这种情况触发的是updated事件,而非deleted事件。 - 硬删除:从回收站永久删除用户,这时候才会触发
deleted事件。
你提到两种删除都试了没收到通知,那接着往下排查其他点。
3. 应用权限是否达标
创建用户订阅需要确保你的应用有正确的Graph API权限:
- 必须申请应用权限(不是委派权限),因为订阅是后台运行的,不需要用户登录。
- 至少需要
Subscription.ReadWrite.All权限创建订阅,同时需要Directory.Read.All权限读取用户数据并接收事件。 - 这些权限必须经过管理员同意,不然就算订阅能创建,也收不到事件通知。
4. 通知URL的可用性问题
虽然用了ngrok,但要确认:
- 用户删除操作执行时,ngrok隧道是否还处于活跃状态?如果隧道断开或者重新生成了URL,订阅里的
notificationUrl就失效了。 - 你的
/api/azure/webhook端点是否支持POST请求?Graph会发送POST格式的通知,要确保端点没有被CORS规则、防火墙拦截。 - 可以用Postman之类的工具手动模拟一个Graph通知请求发送到你的端点,测试是否能正常接收。
5. 检查订阅状态和资源路径
- 你订阅的
users资源路径是对的,但可以用GET /subscriptions/{id}请求确认订阅是否处于正常状态,有没有过期或被取消。 - 确认没有其他同资源的订阅存在冲突,比如重复订阅可能导致通知异常。
6. 辅助排查:查看日志
- 去Azure AD的审核日志里检查用户删除操作是否确实执行成功。
- 你的端点是否有日志记录?看看有没有Graph发送的请求被拦截或者返回了错误状态码(Graph要求通知端点返回
202 Accepted,如果返回错误,可能会停止发送通知)。
内容的提问来源于stack exchange,提问作者Andrew Rasmussen
相关产品推荐
相关产品推荐

