2017-10-16 68 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

請參閱我剛剛編輯的編輯。不管怎麼說,還是要謝謝你! –