使用Invoke-WebRequest获取无用户密码的有效Token权限问题排查
Azure AD Client Credentials Token无权限问题解决
关键遗漏配置及修复步骤
1. 应用权限未完成管理员同意
你已经添加了Directory.Read.All和Group.Read.All应用权限,但这类权限必须经过租户管理员授予同意才会生效。client_credentials模式下,未授权的权限不会被包含在Token中。
操作路径:
- 登录Azure AD门户 → 应用注册 → 选中你的应用 → 进入「API权限」页面
- 点击页面顶部的「授予[你的租户名称]的管理员同意」按钮
- 在确认弹窗中确认权限列表,完成同意操作
2. Scope参数配置错误
你当前的Scope指向自定义API的.default范围,但Directory.Read.All和Group.Read.All是Microsoft Graph的应用权限,因此client_credentials模式下的Scope需要指定Graph的资源:
$response = Invoke-WebRequest -Uri "https://login.microsoftonline.com/TenantID/oauth2/v2.0/token" -Method Post -Body @{ grant_type = "client_credentials" client_id = "" client_secret = "" scope = "https://graph.microsoft.com/.default" } $token = (ConvertFrom-Json $response.Content).access_token
注意:
openid和offline_access是委派权限相关的范围,不适用于应用身份的client_credentials模式,直接移除即可。
3. 验证Token有效性
获取Token后,可将其复制到jwt.ms(本地解析,无需上传数据)查看roles声明,确认是否包含Directory.Read.All和Group.Read.All。如果没有,说明权限未正确注入,需重新检查管理员同意状态和Scope配置。
补充说明
如果你的操作目标是自定义API而非Microsoft Graph,需要额外完成:
- 在自定义API的「公开API」区域配置对应的应用权限范围(当前仅配置了委派的
user_impersonation,无法支持应用权限) - 确保自定义API的应用权限已被授予管理员同意
- 继续使用自定义API的
.defaultScope
内容的提问来源于stack exchange,提问作者Bandit
相关产品推荐
相关产品推荐

