使用Active Directory Graph Client删除AAD B2C用户时遇“Not Initialized”异常求助
解决Azure AD B2C删除用户时的"Not Initialized"异常
我来帮你分析下这个问题哈,你遇到的"Not Initialized"异常其实是因为直接实例化的User对象没有和ActiveDirectoryClient的上下文关联起来,咱们一步步说清楚:
首先看你原来的代码:
Uri servicePointUri = new Uri("https://graph.windows.net"); Uri serviceRoot = new Uri(servicePointUri, "xxxx.onmicrosoft.com"); var activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, async () => await GetAccessToken()); var myUser = new Microsoft.Azure.ActiveDirectory.GraphClient.User() { ObjectId = "63ca9c1d-2bd0-4a6b-8bf6-b850b16ed50b" }; await myUser.DeleteAsync();
问题原因
你直接new出来的User对象并没有被绑定到activeDirectoryClient的上下文里,Graph Client的实体对象(比如User)依赖客户端上下文提供的认证信息、请求管道等配置才能执行DeleteAsync这类操作。脱离上下文的对象内部没有初始化必要的操作环境,所以调用方法时就会抛出"Not Initialized"异常。
两种解决方法
方法一:先通过客户端获取用户实例再删除
这种方式最直接,先利用客户端的Users.GetByObjectId方法获取到已关联上下文的用户对象,再执行删除:
Uri servicePointUri = new Uri("https://graph.windows.net"); Uri serviceRoot = new Uri(servicePointUri, "xxxx.onmicrosoft.com"); var activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, async () => await GetAccessToken()); // 先通过ObjectId获取已关联上下文的用户实例 var myUser = await activeDirectoryClient.Users.GetByObjectId("63ca9c1d-2bd0-4a6b-8bf6-b850b16ed50b").ExecuteAsync(); await myUser.DeleteAsync();
方法二:手动将用户对象附加到客户端上下文
如果你不想先查询用户,也可以手动把new出来的用户附加到客户端上下文,再执行删除操作:
Uri servicePointUri = new Uri("https://graph.windows.net"); Uri serviceRoot = new Uri(servicePointUri, "xxxx.onmicrosoft.com"); var activeDirectoryClient = new ActiveDirectoryClient(serviceRoot, async () => await GetAccessToken()); var myUser = new Microsoft.Azure.ActiveDirectory.GraphClient.User() { ObjectId = "63ca9c1d-2bd0-4a6b-8bf6-b850b16ed50b" }; // 将用户对象附加到客户端的"users"集合上下文 activeDirectoryClient.Context.AttachTo("users", myUser); // 标记对象为待删除状态 activeDirectoryClient.Context.DeleteObject(myUser); // 提交上下文变更完成删除 await activeDirectoryClient.Context.SaveChangesAsync();
内容的提问来源于stack exchange,提问作者Magendran V
相关产品推荐
相关产品推荐

