使用ClientApp通过委托权限获取APIApp令牌失败排查
问题分析与解决
错误原因
你遇到的AADSTS7000218错误,核心原因是你的ClientApp被配置为机密客户端,而设备码流属于公共客户端认证流程——公共客户端(比如桌面、移动应用)不需要提供客户端密钥或断言,Azure AD会跳过客户端身份验证。如果应用注册默认设为机密客户端,Azure AD会强制要求验证客户端身份,因此抛出该错误。
修复步骤
1. 将ClientApp配置为公共客户端
- 登录Azure门户,找到
ClientApp的应用注册 - 进入「认证」页面,下拉到「高级设置」区域
- 将「允许公共客户端流」设置为「是」
- 保存更改
2. 确认委托权限配置正确
- 在
ClientApp的「API权限」页面,添加APIApp的委托权限(不要选应用权限) - 如果是面向租户内所有用户的应用,需点击「授予管理员同意」完成权限生效
3. 修正后的设备码流PowerShell示例
先安装MSAL.PS模块:Install-Module -Name MSAL.PS -Scope CurrentUser,再执行以下代码:
$clientId = "你的ClientApp客户端ID" $tenantId = "你的租户ID" $scopes = "APIApp的应用ID URI/权限名称" # 示例:api://xxxxxx/access_as_user # 发起设备码流认证 $tokenResult = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scopes -DeviceCode # 获取访问令牌 $accessToken = $tokenResult.AccessToken
其他获取委托权限令牌的方式
- 交互式登录流:适合手动操作场景,直接弹出登录界面获取令牌
$tokenResult = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scopes -Interactive - 用户名密码流:非交互式场景(需用户密码,不推荐生产环境使用)
$credential = Get-Credential $tokenResult = Get-MsalToken -ClientId $clientId -TenantId $tenantId -Scopes $scopes -Username $credential.UserName -Password $credential.Password
内容的提问来源于stack exchange,提问作者Daniel M.
相关产品推荐
相关产品推荐

