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

使用Microsoft Graph v4读取Azure B2C自定义属性报字典键不存在错误

问题原因
  • 扩展属性名拼接错误:B2C自定义属性要求extension_后面跟随的扩展应用客户端ID必须删除所有连字符(-),如果直接使用带横线的客户端ID拼接属性名,Graph API无法识别该字段,自然不会返回。
  • 权限配置缺失:读取用户自定义属性需要User.Read.All或Directory.Read.All的应用权限,且需由租户管理员完成管理员同意,未授权的情况下API会过滤自定义属性字段。
  • 用户未设置对应属性:如果目标用户从未赋值过对应的自定义属性,Graph API不会在返回结果中包含该字段,直接索引AdditionalData就会抛出键不存在错误。
解决方案
  1. 修正扩展属性名生成逻辑
    首先找到B2C租户内默认生成的b2c-extensions-app. Do not modify. Used by AADB2C for storing user data.应用注册,复制其客户端ID,删除所有-字符后赋值给_b2cExtensionAppClientId变量。
    示例:原客户端ID为a1b2c3d4-1234-5678-90ab-cdef01234567,处理后应为a1b2c3d41234567890abcdef01234567。

  2. 调整属性读取逻辑,增加空值判断
    避免直接索引AdditionalData字典,改用TryGetValue判断键是否存在后再读取值:

// 读取属性逻辑优化
var mfaType = default(string);
if (values.AdditionalData.TryGetValue(B2CHelper.GetCompleteAttributeName("mfaType"), out var mfaRawValue))
{
    mfaType = mfaRawValue?.ToString();
}

var isEnterprise = default(bool?);
if (values.AdditionalData.TryGetValue(B2CHelper.GetCompleteAttributeName("IsEnterprise"), out var entRawValue) 
    && bool.TryParse(entRawValue?.ToString(), out var entResult))
{
    isEnterprise = entResult;
}
  1. 确认权限配置
    检查Azure.Identity认证使用的应用注册,确保已添加User.Read.All应用权限,且已完成管理员同意。如果使用的是委托认证模式,需改为应用客户端认证模式(如ClientSecretCredential)才能读取完整的用户扩展属性。

  2. 调试验证
    可以先在代码中打印AdditionalData的所有键值,确认返回的属性名是否符合预期,避免拼接错误:

// 调试用:输出所有返回的附加字段
foreach (var key in values.AdditionalData.Keys)
{
    Console.WriteLine($"Key: {key}, Value: {values.AdditionalData[key]}");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 04:54:02