ASP.NET Core Web API Azure AD鉴权IDW10201/AADSTS70011异常排查
鉴权异常修正方案
报错根因说明
AADSTS70011触发逻辑:userimpersonation属于委托权限,仅适配代表终端用户的授权流程(授权码流、ROPC流等)。client_credentials客户端凭证流为纯应用间调用场景,仅支持获取应用级权限,传入委托权限scope会被判定为无效参数。IDW10201触发逻辑:client_credentials流签发的令牌不会携带scope声明,仅会携带应用角色(roles)声明。当前控制器硬编码了仅校验委托scope的RequiredScope特性,会因为找不到匹配的校验声明直接抛出未授权错误。
分步修正操作
调整Azure应用注册配置
- 校验Web API对应应用注册的「公开API」板块,确保App ID URI和调用时使用的
api://xx-3737-48a5-a6c0-7e3bc4f9a5c9完全一致,无多余空格、特殊字符。 - 针对client_credentials调用场景,在应用注册的「应用角色」板块新增自定义应用角色(示例命名:
WeatherAPI.FullAccess);随后在「企业应用」列表找到用于发起调用的客户端服务主体,为该主体分配刚创建的应用角色,确保client_credentials签发的令牌能正常携带roles声明。 - 明确scope使用规则:client_credentials流下的scope参数固定为
<App ID URI>/.default,禁止传入具体委托权限名称,否则会触发AADSTS70011。
调整应用端鉴权代码
- 移除控制器上硬编码的
[RequiredScope(RequiredScopesConfigurationKey = "AzureAd:Scopes")]特性,替换为[RequiredScopeOrAppPermission]特性。该特性可自动适配两类令牌的校验规则:- 代表用户调用场景:校验令牌内的scope声明是否匹配配置的权限
- 纯应用调用场景:校验令牌内的roles声明是否匹配配置的应用权限
- 保留Startup中已有的
AddMicrosoftIdentityWebApi服务注册逻辑,无需额外改动。
调整接口调用请求
- 清除curl请求中参数值附带的换行、隐藏空格(当前示例里的client_id、scope参数值都存在换行格式问题,容易造成和应用注册配置的不匹配)。
- 若需测试委托权限的调用流程,替换授权模式为授权码流,调用时传入
api://<应用客户端ID>/userimpersonation作为scope,该流程签发的令牌会携带对应scope声明,可正常通过鉴权校验。
内容的提问来源于stack exchange,提问作者Luis Valencia
相关产品推荐
相关产品推荐

