是否可以仅请求用户已在 Azure AD OAuth2 隐式流中授予同意的范围的子集?

Is it possible to request only a subset of the scopes for which a user has granted consent in Azure AD OAuth2 implicit flow?

我创建了一个应用程序注册,我们称它为 API,应用程序 ID URI = api://dummyapi,具有读写范围。 在另一个应用程序注册的初始请求中,我们称之为客户端,在用户同意令牌的 scp(scope) =“读写”后,我使用以下请求获得了令牌:

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={client app id}
&response_type=token
&redirect_uri=http://localhost
&scope=api://dummyapi/read api://dummyapi/write
&response_mode=fragment

对于未来的访问令牌请求,是否可以请求具有仅读取范围的令牌? 在以只读方式测试以下请求时,我得到了一个带有 scp = "read write" 的访问令牌。

https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize?
client_id={client app id}
&response_type=token
&redirect_uri=http://localhost
&scope=api://dummyapi/read
&response_mode=fragment

我在考虑一个场景,其中 UI 客户端应用程序具有只读和读写模式,它可以使用 scp=read 为只读模式请求令牌。

目前,Azure AD 将颁发一个访问令牌,其中包含代表登录用户授予的所请求资源的所有已授予委派权限。

The only exception to this 是如果客户端应用程序动态请求权限,并且 请求的授予权限之一是触发条件访问质询。

(此答案的其余部分只是关于该异常的其他详细信息。)

为了更好地理解此异常,请考虑一个示例,其中某个应用已被分级 User.Read、Mail.Read 和 Files.Read.All,并且客户的条件访问策略要求多访问邮件时(而不是访问文件时)进行身份验证,并且用户尚未执行 MFA:

  • 如果应用请求 scope=.default,则条件访问 将被强制执行 ,并且 User.Read、Mail.Read 和 Files.Read 将包含在令牌中。
  • 如果应用程序使用 scope=User.Read Mail.Read,则再次强制执行条件访问,并且令牌将再次包含所有三个权限。请注意,Files.Read.All 没有被明确请求,但它被授予并且包括它不会触发任何额外的条件访问挑战。
  • 如果应用程序请求 scope=User.Read,则 MFA 将 不需要 ,令牌将仅包含 User.Read 和 Files.Read.All。请注意,Mail.Read 未包含 ,因为未明确请求它并且包含它会触发条件访问质询。还要注意 Files.Read.All 包括在内,因为虽然没有明确要求,但它已被授予并且包括它不会触发额外的挑战。