我在我的 Azure 租户中注册了一个新应用程序。 它已配置以下 API 权限,并已获得管理员同意:
如果我使用以下请求正文调用 https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token:
grant_type=password
&username={username}
&password={password}
&client_id={clientId}
&scope=user.read
然后我返回 HTTP 200。
但是,如果我将范围更改为
files.readwrite
,那么我会返回 HTTP 400,但出现以下异常:
AADSTS50158:未满足外部安全挑战。用户将是 重定向到另一个页面或身份验证提供程序以满足 额外的身份验证挑战。
据推测,这要么是寻求 MFA,要么是寻求一些额外的同意。 但是该应用程序没有用户界面,因此我无法遵循用户的同意流程。 我们需要能够预先同意少数用户使用此应用程序。
我在我们的办公室运行此程序,据我所知,这是一个值得信赖的位置 - 因此不会期望遇到 MFA 挑战(如果确实如此)。
我还让我的 Azure 管理员将此特定帐户添加为
Microsoft Entra ID > Enterprise applications > {appName} > Manage > Users and groups
下的用户,但我不确定这是否是必要的步骤,但我读到它会预先同意用户使用该应用程序。
错误 “用户或管理员尚未同意使用 ID 为“{clientId}”、名为“{appName}”的应用程序。为此用户和资源发送交互式授权请求。” 通常在以下情况下发生:传递错误的范围来生成令牌。
要解决错误,您需要将范围传递为
Files.ReadWrite
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:clientID
scope:Files.ReadWrite
grant_type:password
username:username
password:password
注意:ROPC 流程不支持启用 MFA 的帐户,如果尝试使用 ROPC 流程生成令牌,则可能会出现错误。参考这个MsDoc
错误“未满足外部安全挑战。用户将被重定向到另一个页面或身份验证提供程序以满足其他身份验证挑战。”通常在您尝试使用 ROPC 流生成令牌时发生。
因此要解决错误切换到任何其他流程来生成令牌。