在我的Azure Active Directory中的应用程序中,我向Graph API添加了管理员同意所需的权限之一,比方说guardian.addChild(child)
。我点击了Group.Read.All
。如果我以查询参数Grant Admin Consent for ...
的用户身份访问/authorize
端点,则会得到需要管理员批准的视图。如果我在没有任何prompt=consent
参数的情况下访问端点,则一切正常-我能够获得具有适当范围的令牌。在文档中,我读过prompt
参数仅确定同意的可见性。为什么这样工作?
答案 0 :(得分:2)
关于prompt=consent
,OpenID Connect says:
授权服务器在向客户端返回信息之前应提示最终用户同意。如果无法获得同意,则必须返回错误,通常为
consent_required
。
在Microsoft身份平台中,这意味着最终用户将被要求提供同意,即使该用户先前已经同意或(对于工作或学校帐户,由管理员代表用户)。
如果用户无权同意所请求的权限(例如,由于用户同意被禁用或受限制),则使用prompt=consent
将始终对用户造成硬阻止。
在大多数情况下,使用prompt=consent
不是最好的方法。通常考虑三种情况prompt=consent
:
动态定义请求的权限
在the v2.0 endpoint上,scope
参数可用于dynamically请求委托权限列表。例如,要请求read
标识的API的export
和https://api.example.com
委托权限:
scope=openid https://api.example.com/read
Azure AD将确保已授予所有请求的权限,并尝试提示同意尚未授予的任何权限(并且仅针对那些权限)。如果所有请求的权限都已被授予,则颁发的令牌将包括所有授予的权限(即使未明确请求也是如此)。
通常来说,在使用v2.0端点的增量同意功能时,应不使用prompt=consent
。如果需要,Azure AD将提示您进行增量同意。
静态定义了请求的权限
应用程序也只能识别其为其请求访问令牌的资源(即API),具体权限是为该应用程序静态定义的。使用v2.0端点,这是通过the special .default
permission value在scope
参数中完成的:
scope=openid https://api.example.com/.default
在the v1.0 endpoint中,这是使用resource
参数实现的:
resource=https://api.example.com
所需权限的列表是在应用程序注册的静态列表中配置的。在Azure门户中,此列表位于Azure AD>应用程序注册> API权限的配置的权限下。在Microsoft Graph的Application实体中(以及app manifest中),该实体存储在requiredResourceAccess
属性中。
在v1或v2终结点上收到此类请求后,Azure AD将检查已为请求的资源授予了哪些权限:
prompt=consent
,则Azure AD将尝试提示来自以下位置的所有必需权限静态定义的列表。如果配置了其他API,这将包括其他API的权限。scopes
参数 将包括访问令牌中包含的权限列表。依赖静态定义的必需权限(即v2上的/.default
或v1上的resource
)的应用程序应该不对每个登录请求使用prompt=consent
。相反,应用程序应:
prompt=consent
的情况下执行登录。scope
参数:
此策略可确保当管理员代表用户同意(例如,因为他们无权自己同意)时,用户可以登录应用,并且仅强制同意提示(或升级为管理员)配置新权限后,代表他们同意)。
使用prompt=consent
并不是一个好方法。代表用户的管理员)。
相反,应用程序可以使用令牌响应的prompt=consent
参数来构建所需的中断体验(例如,在将用户重定向回应用程序并且已检索到令牌之后,但继续之前),通知用户已授予的权限。
在某些特定情况下,应用程序需要用户同意才能获得请求的权限,并希望不接受管理员代表用户授予的同意。
在这种情况下,可以在所有登录中使用scope
,但是需要考虑以下重要警告:
prompt=consent
(并且如果先前已经同意,则不会提示他们同意)。 / li>
在这种情况下,最好在用户登录后 实施单独的授予许可体验(类似于前面所述的“通知”方案),将应用的其他功能分开Microsoft身份平台提供的同意经验中的同意要求。
答案 1 :(得分:0)
prompt=consent
在用户登录后触发OAuth同意对话框,要求用户向该应用授予权限。
个人访问的应用程序需要至少一个权限,这些权限超出了他们的权限范围。
管理员将看到相同的提示显示许可,并且将看到对传统同意提示的其他控制,该控件将允许他们代表整个租户同意。
将阻止用户授予对该应用程序的同意,并被告知要求其管理员访问该应用程序。
有关更多详细信息,您可以参考此article。