似乎不能保证新邀请的外部用户可以通过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);