当图服务调用返回时,是否不能保证用户已添加到租户中?

2023-12-24

我的应用程序有一个用户管理界面,可供对我们的 Azure 租户没有足够权限的用户进行委派管理。当新用户添加到应用程序时,我们会检查该用户是否已存在于租户中,如果不存在,我们会邀请他们。像这样的事情:

var existingUser = // Try to find the user in the graph by email
if (existingUser == null)
{
    // User doesn't exist, add and get them.
    var invitation = new Invitation
    {
        SendInvitationMessage = false,
        InvitedUserEmailAddress = user.Email,
        InviteRedirectUrl = _inviteSettings.AppUrl
    };

    await _graphClient
        .Invitations
        .Request()
        .AddAsync(invitation);

    existingUser = // Get the user from the graph by email...
}

用户需要多长时间才能通过图形调用进行访问?

我在评论里看到过非正式的here https://stackoverflow.com/questions/60509496/how-to-create-guest-ad-user-invitation-then-add-to-a-sharepoint-online-site-in-p可能需要 5 或 10 秒。 (使用 PowerShell 所以可能不相关?) says:

当用户被邀请时,会创建一个用户实体(userType Guest) 现在可用于控制对资源的访问。

此外,响应示例显示了从请求返回的必要属性。

但问题是在运行时,并不总是能立即找到用户。有时需要两到三次尝试才能成功完成,并且时间超过了上面提到的 10 秒。

当图服务调用返回时,是否不能保证用户已添加到租户中?


注意:我更新了标题“用户需要多长时间才能通过图形调用进行联系?”因为我更关心保证而不是典型的时间跨度。



似乎不能保证新邀请的外部用户可以通过all尽管访客用户已随邀请一起创建,但仍会绘制端点/呼叫图。该用户已经填充了其电子邮件和其他一些详细信息,但仍然无法通过以下方式找到:

// Filter by email to avoid calculating the ugly
// user principal names for external users.
await _graphClient
    .Users
    .Request()
    .Filter($"mail eq '{email}'")
    .GetAsync();

显然,这对于在租户中“足够长”(无论这意味着什么)的域用户和来宾来说效果很好,但对于那些刚刚受邀的人来说则不然。幸运的是,还有另一种方法。

The Invite从图形调用返回包括只读来宾用户的副本。您可以采取InvitedUser.Id支撑价值并针对Users端点显然可以让用户立即可用:

await _graphClient
    .Users[invite.InvitedUser.Id]
    .Request()
    .GetAsync();

补充笔记:解决此问题暴露了为外部用户分配应用程序角色的另一个问题。尝试尽快为他们分配角色总是会导致ServiceException“不是有效的参考更新”使用:

await _graphClient
    .ServicePrincipals[principalId]
    .AppRoleAssignedTo
    .Request()
    .AddAsync(assignment);

这是 Microsoft 推荐的方法,因此我尝试坚持使用它,并添加了一些粗略的重试逻辑来查看我所看到的内容(使用时需要您自担风险和危险):

private async Task<R> RetryTask<R>(Func<Task<R>> func, int max, int delay = 1000, int n = 0)
{
    try
    {
        if (max - n == 1) return default(R);

        await Task.Delay(n * delay);

        return await func();
    }
    catch (Exception e)
    {
        return await RetryTask(func, max, delay, n + 1);
    }
}

问题是等待 10 秒后它不会完成分配;从可用性的角度来看太长了。所以,我尝试了不推荐的方式yahtzee!。我无法找到该建议背后的理由,因此我无法谈论这样做的风险Users并不是ServicePrincipals.

await _graphClient
    .Users[userId]
    .AppRoleAssignments
    .Request()
    .AddAsync(assignment);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当图服务调用返回时,是否不能保证用户已添加到租户中? 的相关文章

随机推荐