gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:15:55 25 4
gpt4 key购买 nike

我的应用程序有一个用户管理界面,可供对我们的 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可能需要 5 或 10 秒。 (使用 PowerShell 所以可能不相关?) MS docs说:

When the user is invited, a user entity (of userType Guest) is createdand can now be used to control access to resources.

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

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

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

<小时/>

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

<小时/>

最佳答案

尽管访客用户已与邀请一起创建,但似乎无法保证新邀请的外部用户可以通过所有图形端点/调用进行访问。该用户已经填充了其电子邮件和其他一些详细信息,但仍然无法找到:

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

这显然适用于在租户中“足够长”(无论这意味着什么)的域用户和 guest ,但不适用于刚刚受邀的人。幸运的是,还有另一种方法。

从图形调用返回的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);

关于c# - 当图服务调用返回时,是否不能保证用户已添加到租户中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66976647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com