Graph SDK 5更新Microsoft B2C用户身份遇请求错误求助
解决Microsoft Graph v5.x更新用户Identities集合时的signInType错误
在Graph v5.x中使用PatchAsync更新用户身份时,即便你通过Fiddler确认新身份的signInType不为空,仍可能触发该错误——问题出在原有身份的字段序列化丢失。v5客户端默认采用增量序列化逻辑,未显式赋值的字段不会被包含在PATCH请求中,但Azure AD要求整个Identities数组里的每个身份对象都必须包含signInType、Issuer和IssuerAssignedId。
正确实现方式
不要直接复用从Graph获取的Identities集合,而是创建全新的ObjectIdentity列表,显式复制原有身份的所有必填字段,再添加新身份:
// 获取目标用户 var user = await client.Users[userId].GetAsync(); // 创建全新身份列表,显式复制原有身份的所有必填字段 var updatedIdentities = user.Identities.Select(id => new ObjectIdentity { SignInType = id.SignInType, Issuer = id.Issuer, IssuerAssignedId = id.IssuerAssignedId }).ToList(); // 添加新身份 updatedIdentities.Add(new ObjectIdentity { SignInType = "emailAddress", Issuer = issuer, IssuerAssignedId = issuerAssignedId }); // 构建仅包含Identities的请求体 var requestBody = new User { Identities = updatedIdentities }; // 执行PATCH操作 await client.Users[userId].PatchAsync(requestBody);
错误原因解析
- v4版本的
UpdateAsync是PUT操作,会发送完整的用户对象,即使原有身份的字段未修改也会被包含在请求中。 - v5版本的
PatchAsync是PATCH操作,客户端仅序列化显式修改过的字段。如果直接复用原有Identities集合,集合里的原有ObjectIdentity对象因未被显式赋值(仅从Graph获取未修改),序列化时会省略signInType等字段,触发Azure AD的校验错误。
内容的提问来源于stack exchange,提问作者dawidg
相关产品推荐
相关产品推荐

