使用Azure AD Graph API在Azure AD B2C创建用户时JSON字符串提交报错
排查Azure AD B2C Graph API创建用户时的Request_BadRequest错误
错误原因分析
从你给出的错误信息和代码来看,有两个关键问题导致了这个Request_BadRequest错误:
缺少
@odata.type属性
你使用的是旧版Azure AD Graph API(从ADAL v2和错误格式可以判断),这个API要求在创建用户的请求体中明确指定实体类型。当你通过JSON文件提交时,文件里应该包含了"@odata.type": "#Microsoft.DirectoryServices.User"这个字段,但直接序列化匿名对象时没有添加,导致API无法识别实体类型。属性名大小写不匹配
代码里的SignInName属性名是错误的,Azure AD Graph API要求的字段名是**signInNames**(全小写开头,复数形式),API对字段名大小写敏感,这个错误也会导致请求体无法被正确解析。
解决方案
修改你的序列化代码,添加必要的@odata.type字段,并修正属性名:
private static void CreateUser(string[] args) { // 修正属性名,添加@odata.type字段 string json = new JavaScriptSerializer().Serialize(new { @odata.type = "#Microsoft.DirectoryServices.User", // 新增实体类型指定 accountEnabled = true, signInNames = new List<UserInformation.SignInName>() { // 修正为正确的字段名 new UserInformation.SignInName(){ type = "emailAddress", value = "safanmomin92@gmail.com" } }, creationType = "LocalAccount", displayName = "Safan Momin", mailNickname = "Safan", passwordProfile = new UserInformation.PasswordProfile { password = "Mazik@123", forceChangePasswordNextLogin = false }, passwordPolicies = "DisablePasswordExpiration" }); object formatted = JsonConvert.DeserializeObject(client.CreateUser(json).Result); }
额外优化建议
- 建议替换
JavaScriptSerializer为你已经在使用的Newtonsoft.Json,它的序列化逻辑更灵活,也更贴合现代JSON规范:string json = JsonConvert.SerializeObject(new { // ... 你的对象属性 }); - 确认
UserInformation.SignInName类中的type和value属性名是小写格式(你的代码里看起来是正确的),避免再次出现字段名不匹配的问题。
内容的提问来源于stack exchange,提问作者3iL
相关产品推荐
相关产品推荐

