You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已授予API权限,Azure AD令牌请求为何返回HTTP 400(AADSTS50158)错误?

问题描述

在Azure租户中注册了新应用,已配置并获得管理员同意的API权限包括File.Read、Files.ReadWrite和User.Read。使用密码模式向https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token发起请求:
当请求体为:

grant_type=password
&username={username}
&password={password}
&client_id={clientId}
&scope=user.read

返回HTTP 200;但将scope改为files.readwrite后,返回HTTP 400,错误信息:

AADSTS50158: External security challenge not satisfied. User will be redirected to another page or authentication provider to satisfy additional authentication challenges.

已知应用无UI,无法引导用户完成额外验证/同意流程,需预先授权少量用户使用;操作处于信任位置(办公室),理论上不应触发MFA,且已将用户添加至Microsoft Entra ID > Enterprise applications > {appName} > Manage > Users and groups,不确定该操作是否能实现预先同意。

解决方案
  • 确认管理员权限同意的有效性
    检查应用注册的API权限中,Files.ReadWrite是否确实标记为已授予管理员同意。注意区分应用权限和委派权限,密码流使用的是委派权限,需确保同意的是对应类型的权限。
  • 排查条件访问策略
    即使在信任位置,可能存在针对Files.ReadWrite权限或特定应用的条件访问策略,强制要求MFA或其他验证步骤。需在Microsoft Entra ID的条件访问面板中,检查是否有策略对该应用、用户或权限范围生效,可临时添加该应用/用户到策略排除列表测试。
  • 用户预授权的正确方式
    将用户添加到企业应用的用户组中,本身不会自动完成权限同意。正确的预委派同意方式是:
    • 使用管理员账户,通过https://login.microsoftonline.com/{tenantId}/adminconsent?client_id={clientId}&scope=files.readwrite user.read链接完成一次性的用户级预同意(此操作需管理员权限,无UI场景下可由管理员手动完成)。
    • 或者在应用注册的API权限页面,针对委派权限选择为{租户名}授予管理员同意,确保所有需要使用该应用的用户都能继承此同意,无需单独用户同意。
  • 密码流的局限性
    密码流本身不支持交互式验证(如MFA),如果条件访问策略强制要求MFA,即使在信任位置也可能触发。此时建议考虑使用客户端凭据流(应用权限)替代,前提是API支持应用级权限;或者调整条件访问策略,允许该应用/用户在信任位置跳过MFA。

内容的提问来源于stack exchange,提问作者Sir Crispalot

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:47:17