携带Bearer Token调用受Azure AD保护API返回401的PowerShell Runbook问题
排查与修正方案
代码层硬错误修正
- 拼写与语法问题
- ADAL类命名空间拼写错误:
Micorsoft.IdentityModel.Clients.ActiveDirectory正确为Microsoft.IdentityModel.Clients.ActiveDirectory - 两处
New-Object调用的字符串未闭合,参数名argumentlsit拼写错误(正确值为argumentlist) - 代码引用的
$ClientId变量无前置赋值
- ADAL类命名空间拼写错误:
- 请求头构造错误
现有请求头写法存在两处不符合OAuth2.0规范的问题:- Authorization值外层包裹多余圆括号,格式非法
- 双引号字符串内直接访问对象属性时,PowerShell仅解析根变量
$ResultToken,.AccessToken会被识别为普通文本,无法正确拼接完整令牌。必须通过$()子表达式包裹属性访问逻辑
错误写法:@{"Authorization"="(Bearer $ResultToken.AccessToken)"}
正确写法:@{"Authorization"="Bearer $($ResultToken.AccessToken)"}
- 令牌受众不匹配
现有代码获取令牌时传入的资源参数为https://graph.microsoft.com(Graph API标识),但调用目标是自定义部署的后端API。Azure AD签发的访问令牌与aud(受众)字段强绑定,Graph标识的令牌无法通过自定义API的身份校验。必须将获取令牌的资源参数替换为自定义API在应用注册中配置的应用ID URI(通常格式为api://<应用客户端ID>)。
配置层校验项
- 确认取令牌所用的服务主体(对应ClientId的应用注册),已在自定义API的应用注册中被分配对应应用权限,且已完成租户级管理员同意
- 确认API端Azure AD认证逻辑的校验参数(受众、发行者地址)与取令牌时传入的参数完全一致
- 若脚本运行在Azure Runbook环境,优先使用内置托管身份能力替代手动ADAL实现:通过
Connect-AzAccount -Identity完成登录后,调用Get-AzAccessToken -ResourceUrl "<自定义API的应用ID URI>"直接获取对应令牌,规避手动加载ADAL程序集、版本不兼容等隐藏问题。
内容的提问来源于stack exchange,提问作者Vishnuraj_
相关产品推荐
相关产品推荐

