User Extensions上的随机访问被拒绝错误

时间:2017-10-16 18:13:43

标签: azure-active-directory microsoft-graph

在图谱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上发布了这个问题。在这里您可以找到有关此问题的更多信息。它现在被标记为一个错误。

2 个答案:

答案 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。请检查错误是否相同,此解决方法是否有用。