在图谱API中使用扩展程序时:
graphUser = graphClient.Users.Request().AddAsync(graphUser).Result;
OpenTypeExtension newExtension = new OpenTypeExtension()
{
ExtensionName = "CustomName",
AdditionalData = new Dictionary<string, object>
{ { "CustomID", user.CustomID }
}
};
graphClient.Users[graphUser.UserPrincipalName]
.Extensions
.Request()
.AddAsync(newExtension)
.Wait();
我随机收到这些错误:
Code: AccessDenied
Message: Access Denied
有时它会起作用,有时却不起作用。我似乎找不到相关性。 当我逐步调试调试器中的代码时,如果我不间断地运行它,它会更频繁地工作。但是如果我在线之间添加一个睡眠(以解决处理延迟),它就无法解决问题。
该应用程序具有访问API的所有必要权限。
问题不仅存在于POST
,还存在于GET
,如下面的代码示例所示,导致相同的错误。
User user = graphClient.Users[userName]
.Request()
.GetAsync()
.Result;
user.Extensions = graphClient.Users[userName]
.Extensions
.Request()
.GetAsync()
.Result;
有没有人有过这个问题的经验?提前谢谢!
编辑:
我发现一旦错误开始显示,就需要删除用户。一个用户的错误并不一定意味着另一个用户的错误。
编辑2:
我也在GitHub上发布了这个问题。在这里您可以找到有关此问题的更多信息。它现在被标记为一个错误。
答案 0 :(得分:2)
事实证明,用户主体名称是缓存的引用。 由于我正在运行测试,意味着重新创建相同的测试用户,因此引用UPN指向旧的用户对象,导致访问被拒绝错误。
使用对象的ID可以避免此问题,如下所示:
graphClient.Users[graphUser.Id]
.Extensions
.Request()
.AddAsync(newExtension)
.Wait();
我相信团队会修复参考错误,但我当然不能代表它们。在任何一种情况下,我都建议使用Id属性来确定。
答案 1 :(得分:0)
根据测试,当我们在Azure Active Directory中创建新用户时,似乎我们可以为该用户操作一些延迟。当我使用Graph过滤用户时,即使用户成功返回,当我向该用户添加扩展时,它仍然可能失败。
对于这个问题,我添加了一行附加代码以使当前线程休眠然后它可以工作。
var userPrincipalName = "userPrincipalName8@adfei.onmicrosoft.com";
var graphUser = new User() { AccountEnabled = true, MailNickname = "MailNickname", UserPrincipalName = userPrincipalName, DisplayName = "userPrincipalName", PasswordProfile = new PasswordProfile() { Password = "islkdifde123!", ForceChangePasswordNextSignIn = false } };
graphUser = graphClient.Users.Request().AddAsync(graphUser).Result;
OpenTypeExtension newExtension = new OpenTypeExtension()
{
ExtensionName = "CustomName",
AdditionalData = new Dictionary<string, object>
{
{ "CustomID", "abc" }
}
};
Thread.Sleep(4000);
graphClient.Users[graphUser.UserPrincipalName]
.Extensions
.Request()
.AddAsync(newExtension)
.Wait();
但是,此问题的详细错误消息应为code=ResourceNotFound,message=User not found
。请检查错误是否相同,此解决方法是否有用。