問題描述
Azure Active Directory(AD)Graph API通過OData REST API終結(jié)點提供對Azure AD的編程訪問權(quán)限。應用程序可以使用Azure AD Graph API對目錄數(shù)據(jù)和對象執(zhí)行創(chuàng)建、讀取、更新和刪除(CRUD)操作。例如,可以使用Azure AD Graph API創(chuàng)建新用戶、查看或更新用戶的屬性、更改用戶的密碼、檢查基于角色的訪問的組成員身份、禁用或刪除用戶。
然而用戶在使用Azure AD Graph API時出現(xiàn)以下狀況:
用戶賦予了Graph API:Read and write directory data權(quán)限(即:Directory.ReadWrite.All):
發(fā)現(xiàn)可以創(chuàng)建、讀取以及更新用戶和組的信息,但是在進行刪除用戶或組的操作時卻出現(xiàn)權(quán)限不足(403)的情況:Insufficient privileges to complete the operation.
問題分析
參考官方文檔Microsoft Graph目錄權(quán)限,可以發(fā)現(xiàn)在Directory.ReadWrite.All的權(quán)限說明中明確指出了不允許應用刪除用戶或組,或重置用戶密碼的操作:
解決方法
目前有兩種方法可以解決Graph API刪除用戶或組權(quán)限不足的情況:
·方法一:將應用程序添加至全局管理員/公司管理員角色(此方法步驟比較繁瑣但是對您的應用程序類型沒有限制)
·方法二:為Microsoft Graph添加:Access directory as the signed-in user(即:Directory.AccessAsUser.All)權(quán)限(此方法步驟比較簡單,可以直接在Azure門戶上進行操作,但是只適用于應用程序類型為本機的應用程序)
方法一:將應用程序添加至全局管理員/公司管理員角色
關于全局管理員/公司管理員角色說明參考官方文檔Azure Active Directory可用的角色:
備注
全局管理員/公司管理員:與此角色的用戶有權(quán)訪問Azure Active Directory,以及對Exchange Online、SharePoint Online和Skype for Business Online等Azure Active Directory聯(lián)合的服務中的所有管理功能。注冊Azure Active Directory租戶的人員將成為全局管理員。只有全局管理員才能分配其他管理員角色。公司中可以有多個全局管理員。全局管理員可以為任何用戶和所有其他管理員重置密碼。在Microsoft Graph API、Azure AD Graph API和Azure AD PowerShell中,此角色標識為“公司管理員”。在Azure門戶中則為“全局管理員”。
由于目前還不可以在Azure門戶上進行該操作,所以我們需要使用Azure ActiveDirectory PowerShell模塊(MSOnline),具體操作步驟如下:
1.安裝MSOnline PowerShell for Azure Active Directory。
2.使用以下命令將應用程序添加至全局管理員/公司管理員角色:
PowerShell
#authenticate to your tenant with your Administrator Account
Connect-MsolService-AzureEnvironment AzureChinaCloud
#Then we need to get the Object ID of both the Service Principal we want to elevate,and the Company Administrator Role for your tenant.
#Search for Service Principal by App ID GUID:
$sp=Get-MsolServicePrincipal-AppPrincipalId<App ID GUID>
#Search for Directory Role by Name
$role=Get-MsolRole-RoleName"Company Administrator"
#Now we can use the Add-MsolRoleMember command to add this role to the service principal.
Add-MsolRoleMember-RoleObjectId$role.ObjectId-RoleMemberType ServicePrincipal-RoleMemberObjectId$sp.ObjectId
#To check everything is working,lets get back all the members of the Company Administrator role:
#You should see your application in that list,where RoleMemberType is ServicePrincipal and DisplayName is the name of your application.
Get-MsolRoleMember-RoleObjectId$role.ObjectId
通過以上步驟就可以將您的應用添加到全局管理員/公司管理員角色了,此時您的應用程序就獲得了全局管理員的所有權(quán)限,再通過Graph API就可以完成用戶或組的刪除操作了:
Connection returned HTTP code:204 with message:No Content
方法二:為Microsoft Graph添加:Access directory as the signed-in user(即:Directory.AccessAsUser.All)權(quán)限
具體操作步驟如下:
1.使用全局管理員身份的用戶登錄Azure門戶。
2.選擇您的應用程序:Azure Active Directory->應用注冊-><您的應用程序>。
3.為您的應用程序添加Access directory as the signed in user權(quán)限:
完成以上操作后,您就可以使用Graph API進行用戶或組的刪除操作了。