如何生成Microsoft Graph API过滤查询以筛选Azure AD B2C中的演示用户扩展属性?
解决Azure AD B2C目录扩展属性的Graph API过滤问题
我来帮你搞定这个过滤查询的问题——你的核心问题是对Azure AD B2C的目录扩展属性在Graph API中的访问方式理解有误,之前的Filter语法不适用这类属性。
问题根源
你创建的extensions_{b2cextensionappid}_IsDemoAccount属于目录扩展属性(Directory Extension),这类属性会直接成为用户对象的顶级属性,而不是嵌套在Extensions集合里的开放扩展(Open Extension)。所以你不需要用Extensions/any(...)这种针对集合的语法,直接使用完整的属性名称即可。
另外要注意:扩展属性名称里的{b2cextensionappid}需要去掉所有连字符,比如原App ID是123e4567-e89b-12d3-a456-426614174000,要改成123e4567e89b12d3a456426614174000。
正确的代码实现
下面是修正后的完整代码示例:
// 1. 获取你的B2C扩展应用ID(来自配置),并移除所有连字符 var extensionAppId = config.Value.B2CExtensionAppId; var cleanExtensionAppId = extensionAppId.Replace("-", string.Empty); // 2. 构造完整的扩展属性名称 var demoAccountProperty = $"extensions_{cleanExtensionAppId}_IsDemoAccount"; // 3. 执行过滤查询 var result = await graphClient.Users .Request() .Filter($"{demoAccountProperty} eq true") .Select($"id, displayName, {demoAccountProperty}") // 可选:指定要返回的属性,减少响应大小 .GetAsync();
关键注意事项
- 权限要求:确保你的API应用已经被授予
User.Read.All或Directory.Read.All的应用权限(Delegated权限也可以,但应用权限更适合后台API场景),并且完成了管理员同意。 - 属性同步:如果是刚创建的扩展属性,需要至少有一个用户被设置过这个属性,Graph API才会识别它并允许过滤。
- 避免Expand:目录扩展属性不需要用
Expand("Extensions"),因为它本身就是用户对象的一部分,直接访问即可。
为什么之前的写法不生效?
你之前用的Extensions/any(...)是针对开放扩展(比如通过graphClient.Users[id].Extensions创建的自定义扩展)的语法,这类扩展是作为独立的集合资源存在的,和你创建的目录扩展不是同一类型,所以语法不兼容。
内容的提问来源于stack exchange,提问作者Saravana Kumar
相关产品推荐
相关产品推荐

