如何在MS Graph用户硬删除时获取用户主体名并处理变更通知?
解决方案
1. 硬删除场景下的资源ID获取
用户硬删除时,MS Graph发送的变更通知里依然会包含ResourceData.Id,这个ID就是被删除用户的原始对象ID,和软删除通知里的ID一致,可直接从notification.ResourceData.Id获取。
2. 获取硬删除用户的UPN(用户主体名)
硬删除后用户对象会被彻底清除,无法通过Graph API查询到信息,因此必须提前留存映射关系:
- 在处理软删除通知时,将用户的ID和UPN存储到本地数据库的对应记录中(或单独维护ID-UPN映射表)。
- 收到硬删除通知时,直接用
ResourceData.Id在本地数据库中查找对应的UPN,无需再调用Graph API。
3. 完整的通知处理逻辑调整
修改接收通知代码,明确区分updated和deleted场景,覆盖软删、硬删处理:
using (StreamReader reader = new StreamReader(requestBbody)) { string content = await reader.ReadToEndAsync(); var notifications = JsonConvert.DeserializeObject<GraphNotifications>(content); foreach (var notification in notifications.Values) { var resourceDataId = notification.ResourceData?.Id; if (string.IsNullOrEmpty(resourceDataId)) continue; if (notification.ChangeType == "updated") { try { var azureUser = await graphClient.Users[resourceDataId].Request().GetAsync(); DbUpdate(azureUser.UserPrincipalName); // 更新本地用户信息 } catch (Exception) { // 处理更新时用户已软删的情况 var directoryObjectSoftDeleted = await graphClient.Directory.DeletedItems[resourceDataId].Request().GetAsync(); var azureUserSoftDeleted = (Microsoft.Graph.User)directoryObjectSoftDeleted; DbUpdate(azureUserSoftDeleted.UserPrincipalName); // 标记本地用户为软删状态 } } else if (notification.ChangeType == "deleted") { try { // 优先从回收站查询,对应软删除场景 var directoryObjectSoftDeleted = await graphClient.Directory.DeletedItems[resourceDataId].Request().GetAsync(); var azureUserSoftDeleted = (Microsoft.Graph.User)directoryObjectSoftDeleted; DbDelete(azureUserSoftDeleted.UserPrincipalName); // 从本地移除软删用户 } catch (ServiceException ex) when (ex.StatusCode == HttpStatusCode.NotFound) { // 回收站无记录,判定为硬删除 var localUser = DbGetUserById(resourceDataId); if (localUser != null) { DbDelete(localUser.UserPrincipalName); // 从本地移除硬删用户 } } } } }
4. 兜底同步机制(避免通知遗漏)
变更通知可能存在丢失风险,建议定期执行全量同步:
- 每日调用
graphClient.Users.Request().GetAsync()获取所有活跃用户,对比本地数据库,移除不在活跃列表且未出现在回收站的用户(即硬删用户)。 - 调用
graphClient.Directory.DeletedItems.Request().GetAsync()获取所有软删用户,确保本地数据库中对应用户已被标记或移除。
内容的提问来源于stack exchange,提问作者Pearl
相关产品推荐
相关产品推荐

