2017-04-24 79 views
1

我們嘗試使用圖形API設置由Azure AD管理的用戶帳戶的屬性。我們的想法是,在用戶完成註冊政策後,我們調用後端Web API(通過Azure AD)以設置用戶自己無法設置的某些屬性(例如,我們的新用戶的內部客戶ID)。雖然授予了權限,圖API不斷返回Authorization_RequestDenied

不幸的是,當試圖發送更新用戶的修補程序請求時,Graph API不斷返回異常(「權限不足以競爭此操作」)。 我試圖授予所有用戶作爲管理員的權限,因爲當帳戶更新時沒有用戶登錄。我基本上希望我的應用程序成爲能夠自動管理用戶配置文件的第三方。

我的代碼如下所示:

public class GraphAPIClient 
{ 
    private AuthenticationContext authContext; 
    private ClientCredential clientCredential; 
    private string adTenant; 

    public GraphAPIClient(string tenant, string clientID, string clientSecret) 
    { 
     authContext = new AuthenticationContext("https://login.microsoftonline.com/" + tenant); 
     clientCredential = new ClientCredential(clientID, clientSecret); 
     adTenant = tenant; 
    } 

    public async Task<string> UpdateUserInfo(string objectID, string jsonUpdate) 
    { 
     return await SendPatchRequest("https://stackoverflow.com/users/" + objectID, jsonUpdate); 
    } 

    private async Task<string> SendPatchRequest(string api, string jsonRequest) 
    { 
     AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.windows.net/", clientCredential); 
     HttpClient httpClient = new HttpClient(); 
     string url = "https://graph.windows.net/" + adTenant + api + "?" + "api-version=1.6"; 

     HttpRequestMessage request = new HttpRequestMessage(new HttpMethod("PATCH"), url); 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); 
     request.Content = new StringContent(jsonRequest, Encoding.UTF8, "application/json"); 

     HttpResponseMessage response = await httpClient.SendAsync(request); 
     if(!response.IsSuccessStatusCode) 
     { 
      string error = await response.Content.ReadAsStringAsync(); 
      object formattedError = JsonConvert.DeserializeObject(error); 
       throw new Exception("Graph API request failed:\n" + JsonConvert.SerializeObject(formattedError, Formatting.Indented)); 
     } 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 

我使用的註冊應用程序的應用程序ID,該目錄的租客,而我在Azure中已經生成的客戶端祕密的關鍵。我成功收到一個令牌。

我已經試過:

  • 我已(或我想我有)編輯用戶所需的權限。我使用管理員帳戶點擊了「授予權限」,並在Azure面板中查看時顯示了權限: Image
  • 我已經設置了「讀寫所有用戶的完整配置文件」和「讀寫目錄數據」。這些是這種任務的正確權限嗎?
  • 我也嘗試過使用新的應用程序註冊控制檯,但在嘗試獲取令牌時,出現「調用應用程序的標識無法建立」異常。在此控制檯中創建的應用程序在正常的Azure AD面板中不可見。

任何人都可以幫助我嗎?我已經徹底搜索了,但有關此問題的大多數問題都比較老,建議使用舊的Azure面板。我已經嘗試過了,但它仍然不起作用,我認爲新的Azure面板最近才收到AD編輯功能,並且在問這些問題時沒有。

非常感謝 - 如果您需要更多信息,我很樂意提供。

+0

你是否也經歷了管理員同意工作流程? –

+0

我不認爲我有 - 有沒有辦法給管理員同意一次或整個應用程序一次或自動在應用程序內?我基本上希望開發一個後臺應用程序,將用戶賬戶中的信息添加到用戶自己無法設置的地方(因爲這是他不知道的內部信息)。我知道有同意工作流要求用戶同意,但這似乎並不是我在這裏尋找的,因爲它不是嘗試訪問現有用戶帳戶的第三方應用程序(如使用Office),但我們的自己的directoy ... – Philippe

回答

0

您的場景和代碼都反映了使用客戶端憑證流程和應用程序權限。但是,您從Azure門戶截圖僅顯示已設置委派權限。

取決於你想要什麼樣的權限/操作,您可以利用兩種方法:

  1. 最容易建立,但有限的權限集:通過在Azure門戶。確保您從「應用程序權限」中選擇權限,然後點擊授予權限。如果沒有人顯示這是因爲您已將您的應用程序創建爲本機應用程序。對於無頭的客戶,將安全地坐在你的服務器端(未移交給最終用戶),你應該選擇的Web應用程序/ API,這將給你訪問應用程序的權限:

    Application permissions in Azure Portal

  2. 最難成立,但最廣泛的權限集合:通過PowerShell。如果您想要刪除用戶,這是唯一可行的選項。你需要讓你的應用程序的ServicePrincipalID然後再授予服務主體所需的角色如下:

    $appDisplayName = <Your-app-display-name> 
    
    $msolcred = Get-Credential 
    Connect-MsolService -credential $msolcred 
    
    $servicePrincipal = Get-MsolServicePrincipal | where DisplayName -eq $appDisplayName 
    $objectId = $servicePrincipal.ObjectId.ToString() 
    
    Add-MsolRoleMember -RoleObjectId 88d8e3e3-8f55-4a1e-953a-9b9898b8876b -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    Add-MsolRoleMember -RoleObjectId 9360feb5-f418-4baa-8175-e2a00bac4301 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    Add-MsolRoleMember -RoleObjectId fe930be7-5e62-47db-91af-98c3a49a38b1 -RoleMemberObjectId $objectId -RoleMemberType servicePrincipal 
    

    或者,您可以按照this article.步驟。

+0

「如果沒有顯示,那是因爲您已經創建了您的應用程序作爲本機應用程序。」 **謝謝!**我一直在想,爲什麼沒有應用程序權限顯示,我沒有想出。 但它仍然無法正常工作。我已經設置了以下權限並授予他們,但我仍然會遇到這種情況:http://imgur.com/a/O8ktB 我曾經收到錯誤的請求錯誤,但是我認爲如果JSON字符串是無論如何都是無效的。 – Philippe

+0

Nevermind - 我生成了一個新密鑰,現在它可以工作。非常感謝你,這真的很有幫助。 – Philippe