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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:17:27