使用PnP PowerShell非交互式访问SharePoint遇AADSTS53003认证错误
问题背景
我需要提取SharePoint列表架构并实现自动化,因此采用PnP PowerShell模块进行非交互式登录操作。已按照PnP指引创建应用注册,但未添加平台与重定向URI。使用拥有网站完全控制权限的个人账号密码本地测试脚本时,出现以下错误:Error occurred: AADSTS53003: Access has been blocked by Conditional Access policies. The access policy does not allow token issuance. The returned error contains a claims challenge.
测试代码:
$encryptedPassword = ConvertTo-SecureString -String $password -AsPlainText -Force $creds = New-Object System.Management.Automation.PSCredential -ArgumentList ($username, $encryptedPassword) Connect-PnPOnline -Url $targetSite -ClientId $ClientId -Credentials $creds -Verbose
我们希望避免使用自签名证书(需内部审批流程),且PnP认为密钥/访问令牌属于旧方法,不清楚是什么阻止了程序访问站点?
核心原因
这个错误是Azure AD条件访问策略直接拦截了非交互式登录请求,常见触发场景:
- 租户启用了针对用户的强制MFA(多因素认证)策略,而当前使用的纯密码流不支持MFA验证
- 条件访问策略限制仅允许受信任/合规设备登录,脚本运行的设备不在信任范围内
- 应用注册配置缺失(如未设置重定向URI、权限类型错误),被策略判定为非合规请求
无需证书的解决步骤
1. 补全应用注册基础配置
- 进入Azure AD应用注册页面,添加重定向URI:选择「公共客户端/移动和桌面应用」类型,填入
http://localhost(PnP PowerShell公共客户端模式默认依赖此地址) - 为应用注册授予SharePoint Sites.FullControl.All应用权限(委托权限不适用于非交互式场景),并完成管理员全局同意
2. 改用兼容MFA的非交互式登录方式
若租户强制MFA,纯密码流必然被拦截,推荐使用设备代码流(无需证书、无需存储密码):
Connect-PnPOnline -Url $targetSite -ClientId $ClientId -Interactive -DeviceCode
首次运行会生成设备验证代码,用有权限的账号在任意设备上完成MFA验证后,脚本会获得持久化令牌缓存,后续非交互式运行可自动复用验证状态。
3. 协调管理员调整条件访问策略
- 联系租户管理员,确认是否有针对「所有云应用」或「SharePoint Online」的条件访问策略,是否允许公共客户端应用(PnP PowerShell属于此类)通过
- 若允许,可在策略中添加例外:将目标应用注册或脚本运行设备纳入信任范围
关键注意点
- PnP官方推荐的非交互式方案中,设备代码流是无需证书的最优选择,既规避了密码存储风险,也能兼容MFA和条件访问策略
- 避免用个人账号密码做自动化:个人账号的MFA要求、密码过期会导致脚本频繁失效,应优先采用应用权限+设备代码/证书的组合
内容的提问来源于stack exchange,提问作者Hamza Malik
相关产品推荐
相关产品推荐

