Azure B2C通过Microsoft Graph API添加带自定义声明的用户问题
我来帮你解决这个问题!在Azure B2C中,自定义声明实际上是作为目录扩展属性存储的,所以不能直接像内置用户属性那样添加到User对象里。你需要先确认这个sample声明对应的扩展属性完整名称,然后在Graph API请求中指定它。
第一步:获取自定义声明对应的扩展属性名称
B2C中的自定义声明会被映射为格式固定的目录扩展属性,名称规则是:extension_<你的应用客户端ID(去掉所有横杠)>_<声明名称>
比如你的应用客户端ID是123e4567-e89b-12d3-a456-426614174000,去掉横杠后变为123e4567e89b12d3a456426614174000,那么sample声明对应的扩展属性名就是extension_123e4567e89b12d3a456426614174000_sample。
你可以通过两种方式确认这个名称:
- 登录Azure Portal,进入你的B2C租户,打开用户属性,找到你创建的
sample属性,查看它的「名称」字段(就是带extension_前缀的完整值); - 调用Graph API查询一个已通过自助注册添加的用户:
GET /beta/users/{userId}?$select=extension_*,返回结果里就能看到sample对应的扩展属性键。
第二步:修改代码添加自定义声明
使用Microsoft Graph SDK(C#)的解决方案
你需要在User对象中添加AdditionalData字典,把扩展属性的键值对放入其中。修改后的代码如下:
var confidentialClientApplication = ConfidentialClientApplicationBuilder .Create(clientId) .WithTenantId(tenantId) .WithClientSecret(clientSecret) .Build(); var authProvider = new ClientCredentialProvider(confidentialClientApplication); var client = new GraphServiceClient(authProvider); // 替换成你实际的扩展属性名称 var sampleExtensionName = "extension_<你的应用客户端ID(去横杠)>_sample"; var user = new User { AccountEnabled = true, DisplayName = "John Smith", UserPrincipalName = $"john.smith@{tenantId}", MailNickname = "john.smith", PasswordProfile = new PasswordProfile { ForceChangePasswordNextSignIn = false, Password = "P@ssword1" }, // 添加自定义扩展属性 AdditionalData = new Dictionary<string, object> { { sampleExtensionName, "你的自定义值" } } }; var addedUser = await client.Users.Request().AddAsync(user);
使用直接HTTP请求的解决方案
在POST请求的JSON体中,直接添加扩展属性的键值对即可:
POST /v1.0/users HTTP/1.1 Host: graph.microsoft.com SdkVersion: postman-graph/v1.0 Content-Type: application/json Authorization: Bearer [redacted] User-Agent: PostmanRuntime/7.20.1 Accept: */* Cache-Control: no-cache Postman-Token: [redacted] Host: graph.microsoft.com Accept-Encoding: gzip, deflate Content-Length: 325 Connection: keep-alive cache-control: no-cache { "accountEnabled": true, "displayName": "Joe Blogs", "mailNickname": "joe.blogs", "userPrincipalName": "joe.blogs@[redacted].onmicrosoft.com", "passwordProfile": { "forceChangePasswordNextSignIn": true, "password": "P@ssword1" }, "passwordPolicies": "DisablePasswordExpiration", // 添加自定义扩展属性,替换成实际的名称 "extension_<你的应用客户端ID(去横杠)>_sample": "你的自定义值" }
关键注意事项
- 权限要求:确保你的应用注册拥有
Directory.ReadWrite.All的应用权限(因为你使用客户端凭据流后台调用,不是用户委托权限),并且已经获取了管理员同意; - 扩展属性存在性:这个扩展属性必须已经在你的B2C租户中创建(你已经通过自助注册使用,说明它已经存在);
- API版本:如果v1.0版本遇到问题,可以尝试使用beta版本的Graph API(将请求路径改为
/beta/users)。
内容的提问来源于stack exchange,提问作者Tanzy
相关产品推荐
相关产品推荐

