2017-03-01 63 views
0

我們的應用程序將做簡單的User.ReadBasic.All函數,根據我的理解,它不需要管理員權限。 使用流記錄在這裏:https://graph.microsoft.io/en-us/docs/authorization/app_onlyAuthorization_IdentityNotFound錯誤MS Graph API

  POST https://login.microsoftonline.com/{tenantId}/oauth2/token    HTTP/1.1 
     Content-Type: application/x-www-form-urlencoded 

     grant_type=client_credentials 
     &client_id=<clientId> 
     &client_secret=<clientSecret> 
     &resource=https://graph.microsoft.com 

我能夠調用返回以下錯誤消息的圖形時,獲得一個有效的訪問令牌,但是:

  「code": "Authorization_IdentityNotFound", "The identity of the calling application could not be established." 

我們已經建立了我們的應用程序在管理控制檯中擁有User.ReadAll.Basic權限,有趣的是,當我使用我自己的憑證/令牌緩存啓動具有appId和Secret的ConfidentialClientApplication實例時,我確實從API獲得了成功的結果,並且爲令牌調用AcquireTokenSilentAsync:

 string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value; 
     tokenCache = new SessionTokenCache(
      signedInUserID, 
      HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase); 

     ConfidentialClientApplication cca = new ConfidentialClientApplication(
      appId, 
      redirectUri, 
      new ClientCredential(appSecret), 
      tokenCache); 

但是我們正在創建一個無狀態,無頭的服務,它將沒有用戶交互,因此理想情況下我們不想回複用戶憑證和令牌緩存以檢索訪問令牌。我不確定爲什麼一個場景有效,另一個是返回IdentityNotFound錯誤,並且您有任何建議都是值得歡迎的。

+0

你能解決這個問題嗎?我有同樣的問題 – NBajanca

+0

嗨@NBajanca是這是一個關於我們試圖訪問的特定範圍管理員權限的問題。一旦我們的應用程序被授予訪問管理員讀取我們租戶中的目錄數據,我們就可以通過應用程序身份查詢(我們決定使用比應用程序祕密更安全的證書)讓我知道如果您有任何其他問題 – ranah

+0

謝謝,同時我也發現了這一點。我在Microsoft圖形文檔中創建了一個問題,看看他們是否可以更好地解釋範圍 – NBajanca

回答

0

從我瞭解的不需要管理員權限。

AFAIK,當使用客戶端憑證流程時,我們需要爲app設置應用程序權限,委託權限用於委託流程。

你可以嘗試下面的代碼使用ADAL讓用戶:

 string authority = "https://login.microsoftonline.com/a703965c-e057-4bf6-bf74-1d7d82964996"; 
     AuthenticationContext authenticationContext = new AuthenticationContext(authority, false); 
     var result= await authenticationContext.AcquireTokenAsync("https://graph.microsoft.com", new ClientCredential("clientid", "clientsecret")); 


     string sURL = "https://graph.microsoft.com/v1.0/users"; 

     WebRequest request1 = WebRequest.Create(sURL); 
     request1.Method = "GET"; 
     request1.Headers.Add("Authorization", "Bearer " + result.AccessToken); 
     HttpWebResponse response1 = (HttpWebResponse)request1.GetResponse(); 
     if (response1.StatusCode == HttpStatusCode.OK) 
     { 
      // some code 
     } 

您可以設置 「讀取所有用戶的全部資料」 申請許可Microsfot圖(測試):

​​