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

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": "你的自定义值"
}

关键注意事项

  1. 权限要求:确保你的应用注册拥有Directory.ReadWrite.All的应用权限(因为你使用客户端凭据流后台调用,不是用户委托权限),并且已经获取了管理员同意;
  2. 扩展属性存在性:这个扩展属性必须已经在你的B2C租户中创建(你已经通过自助注册使用,说明它已经存在);
  3. API版本:如果v1.0版本遇到问题,可以尝试使用beta版本的Graph API(将请求路径改为/beta/users)。

内容的提问来源于stack exchange,提问作者Tanzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:00:46