PowerShell调用MS Graph查询Azure AD组报403 Forbidden错误
问题场景
需要通过PowerShell调用Microsoft Graph接口,获取Azure AD组的displayName和createdDateTime属性,使用客户端凭据认证流编写脚本如下:
$Body = @{ client_id = "app_id" client_secret = "secret" scope = "https://graph.microsoft.com/.default" grant_type = 'client_credentials' } $Connect_Graph = Invoke-RestMethod -Uri "https://login.microsoftonline.com/my_tenant_id/oauth2/v2.0/token" -Method Post -Body $Body $token = $Connect_Graph.access_token $query = "https://graph.microsoft.com/v1.0/groups/" $groups = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($token)"} -Uri $query -Method Get).value | Select displayName, createdDateTime
脚本运行时返回403 Forbidden错误,具体报错信息:
Invoke-RestMethod : The remote server returned an error: (403) Forbidden. At C:\Users\script.ps1:13 char:12 + $groups = (Invoke-RestMethod -Headers @{Authorization = "Bearer $($to ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
已经为对应应用授予了Group.Read.All和Directory.Read.All权限,问题仍然存在。
故障原因
- 权限类型配置错误:脚本使用的
client_credentials客户端凭据流是纯应用身份认证,无用户登录上下文,仅应用程序类型的Graph权限会在该流中生效。如果之前添加的是委托(Delegated)类型的Group.Read.All/Directory.Read.All,这类权限在客户端凭据流下完全不生效。 - 未完成管理员同意流程:就算添加了正确的应用类型权限,如果没有执行租户级管理员同意操作,权限不会实际生效,调用接口时会被拒绝。
- 旧令牌未更新:权限配置修改前获取的access_token不会自动同步新的权限声明,用旧令牌调用接口还是会返回403错误。
修复步骤
- 打开Azure AD应用注册页面,定位到脚本使用的对应应用,进入「API权限」配置面板
- 移除当前已添加的委托类
Group.Read.All、Directory.Read.All权限,重新添加权限时选择应用程序权限分类下的同名权限,不要选委托权限选项 - 点击面板顶部的「授予管理员同意」按钮,使用租户管理员账号完成同意操作,等待配置生效
- 重新运行脚本获取全新的access_token,再调用groups接口即可正常返回数据。
验证技巧:可以将获取到的access_token解码,查看payload中的
roles字段,如果数组中包含Group.Read.All,说明权限配置正确。
内容的提问来源于stack exchange,提问作者Kattiri Venkataratnam
相关产品推荐
相关产品推荐

