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

spo*_*ida 8 azure-ad-b2c microsoft-graph-sdks microsoft-graph-api

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

根据Microsoft Graph 文档,这应该是可能的,前提是我:

  1. User.ManageIdentities.All向我用来进行图形调用的客户端分配权限
  2. 发送整个现有身份集合,并附加新的身份条目(这也确保了具有signInType的现有身份userPrincipalName也在请求中发送)

我已在 B2C 租户中注册了一个应用程序,并为其分配了访问 Microsoft Graph 的特定权限。我正在使用客户端凭据流程来获取具有声明中适当权限的访问令牌roles。我可以成功获取访问令牌,并通过检查颁发的 JWT 确认是否存在所需的权限。

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

var user = await client.Users[userId].Request()
    .Select(o => new { o.Id, o.DisplayName, o.Identities })
    .GetAsync();
Run Code Online (Sandbox Code Playgroud)

检索用户后,我尝试向该用户的属性添加另一个条目identities,并为该用户发出更新图调用。请注意,SDK 要求更新调用仅使用本地创建的对象,即您无法发送之前通过 SDK 获取的现有对象。

我的完整更新代码如下

async Task TryUpdateUser(GraphServiceClient client, string userId)
{
    var user = await client.Users[userId].Request()
        .Select(o => new { o.Id, o.DisplayName, o.Identities })
        .GetAsync();

    // Need to re-create the existing identities since Graph client rejects existing items in requests
    var identities = user.Identities.Select(o => new ObjectIdentity 
    {
        SignInType = o.SignInType,
        Issuer = o.Issuer,
        IssuerAssignedId = o.IssuerAssignedId
    }).ToList();

    identities.Add(new ObjectIdentity
    {
        SignInType = "federated",
        Issuer = "TestIssuer",
        IssuerAssignedId = "testingId"
    });

    var updatedUser = new User
    {
        Identities = identities
    };

    await client.Users[userId].Request().UpdateAsync(updatedUser);
}
Run Code Online (Sandbox Code Playgroud)

但是,当UpdateAsync调用时,会抛出响应类型为 的异常BadRequest。错误消息指出:

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

我显然正在尝试创建联合用户signInType,因此引用非联合用户signInType 的错误消息文本让我感到困惑。

我究竟做错了什么?

Jim*_* Xu 2

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

在此输入图像描述

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