2017-10-16 36 views
6

当使用扩展图形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

它不应该改变行为,因为.Result等待操作完成。这可能更有效,但由于项目的性质,我不能很好地实施这个解决方案。 –

回答

2

事实证明,用户主要名称是一个缓存的引用。 由于我正在运行测试,意思是重新创建相同的测试用户很多,引用UPN指向旧用户对象导致访问被拒绝错误。

可以通过使用对象的ID,这样即可避免此问题:

graphClient.Users[graphUser.Id] 
    .Extensions 
    .Request() 
    .AddAsync(newExtension) 
    .Wait(); 

我相信球队会修复引用错误,但我不能为他们说话课程。无论哪种情况,我都会建议使用Id属性。

+0

感谢您帮助我们识别此问题并发布解决方法。 –

0

基于测试,当我们在Azure Active Directory中创建新用户时,似乎我们可以为该用户操作一些延迟。即使用户在使用图表过滤用户时也能成功返回,但当我将该扩展添加到该用户时,它仍可能失败。

对于这个问题,我添加了一行附加代码以使当前线程处于睡眠状态,然后工作。

var userPrincipalName = "[email protected]"; 
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。请检查错误是否相同,并且此解决方法有帮助。

+0

我已经尝试过这种解决方案,但为了彻底,我再次尝试。不幸的是,它导致了相同的拒绝访问错误。 –

+0

为线程睡眠设置更长时间有帮助吗?你介意分享详细的错误信息,你可以用Fiddler跟踪它吗? –

+0

请参阅我刚刚编辑的编辑。不管怎么说,还是要谢谢你! –