Microsoft graph api 如何使用Microsoft Graph和SDK更新现有B2C用户的身份集合

Microsoft graph api 如何使用Microsoft Graph和SDK更新现有B2C用户的身份集合,microsoft-graph-api,azure-ad-b2c,microsoft-graph-sdks,Microsoft Graph Api,Azure Ad B2c,Microsoft Graph Sdks,我正在尝试更新Azure AD B2C租户中现有用户的身份集合。具体来说,我正在尝试为用户添加另一个联合身份条目 根据合同,如果我: 将User.manageIdentifications.All权限分配给我用于进行图形调用的客户端 发送整个现有标识集合,并附加新的标识条目。这还确保在请求中也发送带有SignityType userPrincipalName的现有标识 我已在B2C租户中注册了一个应用程序,并为其分配了访问Microsoft Graph的特定权限。我正在使用客户端凭据流获取具有角

我正在尝试更新Azure AD B2C租户中现有用户的身份集合。具体来说,我正在尝试为用户添加另一个联合身份条目

根据合同,如果我:

将User.manageIdentifications.All权限分配给我用于进行图形调用的客户端 发送整个现有标识集合,并附加新的标识条目。这还确保在请求中也发送带有SignityType userPrincipalName的现有标识 我已在B2C租户中注册了一个应用程序,并为其分配了访问Microsoft Graph的特定权限。我正在使用客户端凭据流获取具有角色声明中相应权限的访问令牌。我可以成功获得访问令牌,并通过检查已发布的JWT确认存在所需的权限

我还使用从C代码调用graph v1.0端点。我有一个正在尝试更新的现有用户,该用户具有一个众所周知的userId objectId。使用访问令牌和GraphServiceClient,我可以成功地检索用户。例如,以下代码可以正常工作

var user=wait client.Users[userId]。请求 .Selecto=>new{o.Id,o.DisplayName,o.identies} .GetAsync; 检索用户之后,我尝试为该用户的Identifications属性添加另一个条目,并为该用户发出更新图调用。请注意,SDK要求更新调用仅使用本地创建的对象,即不能发送以前通过SDK获取的现有对象

我的完整更新代码如下

异步任务TryUpdateUserGraphServiceClient客户端,字符串用户ID { var user=wait client.Users[userId]。请求 .Selecto=>new{o.Id,o.DisplayName,o.identies} .GetAsync; //需要重新创建现有标识,因为Graph client拒绝请求中的现有项 var identies=user.identies.Selecto=>newobjectidentity { SignInType=o.SignInType, 发行人=o.发行人, issuerasignedid=o.issuerasignedid }托利斯特先生; 身份。添加新的对象身份 { signentype=federated, 发行人=测试发行人, issuerasignedid=testingId }; var updateuser=新用户 { 身份=身份 }; 等待client.Users[userId].Request.UpdateAsyncupdatedUser; } 但是,当调用UpdateAsync时,将引发响应类型为BadRequest的异常。错误消息指出:

消息:如果用户仅具有社交/联盟身份或未设置身份,则不允许添加非联盟用户登录类型。请使用非联合身份以及现有身份(如果有)重新创建用户

很明显,我正试图创建一个联邦用户signitype,因此引用非联邦用户signitype的错误消息文本让我感到困惑


我做错了什么?

目前,我们无法将Azure AD b2c联合用户从一个身份提供商迁移到另一个身份提供商,并为Azure AD b2c联合用户添加另一个身份提供商或非联合身份用户名或电子邮件地址。如果您尝试这样做,您将得到如上所述的错误

此外,请注意,我们可以为Azure AD b2c本地用户添加一个身份提供商。

正如公认的答案所指出的,Microsoft Graph API目前不支持更新现有的联合用户以添加其他联合身份

但是,可以使用Azure AD Graph API来实现这一点。有关可用的用户更新选项,请参阅

假设我们有一个要更新的用户ID,您需要执行以下操作:

通过向发出GET请求来检索用户的现有用户标识https://graph.windows.net/{tenant}/users/{userId}/useridenties?api版本=1.6 向现有标识添加另一个条目-重要的是,当您指定issuerUserId值时,它必须是base64编码的 向位于的基本用户终结点发送修补程序请求https://graph.windows.net/{tenant}/users/{userId}?api version=1.6-您发送的内容只是一个JSON对象,具有一个userIdentities属性,该属性是包含现有标识和新添加标识的数组
通过AAD Graph API发出补丁请求后,然后可以使用Microsoft Graph API查询更新后的用户,并确认已向标识集合添加了一个附加条目,该条目的signityType为federated。

我猜您必须拥有一个锚标识,即本地帐户,才能将这些其他帐户类型链接到。如果您同时在Identities.Add中创建一个虚拟本地帐户,会发生什么情况?这不会解决您的问题,但此功能是GA。请使用v1.0终结点和v1.0 SDK。@nzpcmad我尝试了添加
nal标识具有SignityType用户名和emailAddress,但我仍然收到相同的错误。@spoida原始帐户是联合帐户,对吗?@JimXu是的,该用户最初是通过联合登录创建的。感谢您确认当前行为。仅供参考,这可以使用Azure AD Graph API代替。尽管AAD Graph API已被弃用,但在本例中,它具有Microsoft Graph API当前缺少的功能。我会将您的答案标记为正确,但我也会提交一个答案,说明如何使用AAD Graph API实现这一点。