设置提示=同意后,Azure Active Directory需要管理员批准

时间:2020-02-07 10:45:27

标签: azure oauth azure-active-directory

在我的Azure Active Directory中的应用程序中,我向Graph API添加了管理员同意所需的权限之一,比方说guardian.addChild(child)。我点击了Group.Read.All。如果我以查询参数Grant Admin Consent for ...的用户身份访问/authorize端点,则会得到需要管理员批准的视图。如果我在没有任何prompt=consent参数的情况下访问端点,则一切正常-我能够获得具有适当范围的令牌。在文档中,我读过prompt参数仅确定同意的可见性。为什么这样工作?

2 个答案:

答案 0 :(得分:2)

关于prompt=consentOpenID Connect says

授权服务器在向客户端返回信息之前应提示最终用户同意。如果无法获得同意,则必须返回错误,通常为consent_required

在Microsoft身份平台中,这意味着最终用户将被要求提供同意,即使该用户先前已经同意或(对于工作或学校帐户,由管理员代表用户)。

如果用户无权同意所请求的权限(例如,由于用户同意被禁用或受限制),则使用prompt=consent将始终对用户造成硬阻止。

在大多数情况下,使用prompt=consent不是最好的方法。通常考虑三种情况prompt=consent

  1. 您已更改所需的权限。所需的权限已更改(例如,已添加或删除了权限),并且用户需要同意新的权限集。
  2. 您想通知用户。应用程序开发人员希望确保通知用户该应用程序将被授权行使的权限(即使管理员已经代表该用户同意)。
  3. 您需要征得用户本人(而不是管理员)的同意。应用程序开发人员希望确保最终用户自己提供同意,而与管理员先前的授权无关。

如果您更改了所需的权限

动态定义请求的权限

the v2.0 endpoint上,scope参数可用于dynamically请求委托权限列表。例如,要请求read标识的API的exporthttps://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 valuescope参数中完成的:

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将检查已为请求的资源授予了哪些权限:

  1. 如果已为请求的资源授予 no 委派权限(如果使用了prompt=consent,则Azure AD将尝试提示来自以下位置的所有必需权限静态定义的列表。如果配置了其他API,这将包括其他API的权限。
  2. 如果已为请求的资源授予任何委派权限,则Azure AD将颁发具有所有授予的权限的令牌。响应的scopes参数 将包括访问令牌中包含的权限列表。

依赖静态定义的必需权限(即v2上的/.default或v1上的resource)的应用程序应该对每个登录请求使用prompt=consent 。相反,应用程序应:

  1. 没有 prompt=consent的情况下执行登录。
  2. 检查响应scope参数:
    • 如果列出了所需的权限,则无需采取进一步措施。
    • 如果没有(例如,如果在用户最初同意该应用后将新权限添加到所需权限列表中),则只有 才能再次将用户发回,这一次是{ {1}}。

此策略可确保当管理员代表用户同意(例如,因为他们无权自己同意)时,用户可以登录应用,并且仅强制同意提示(或升级为管理员)配置新权限后,代表他们同意)。

如果您想通知用户

如果目标是仅通知用户(该应用程序先前由用户或由用户授权被授予行使权限),则

使用prompt=consent并不是一个好方法。代表用户的管理员)。

相反,应用程序可以使用令牌响应的prompt=consent参数来构建所需的中断体验(例如,在将用户重定向回应用程序并且已检索到令牌之后,但继续之前),通知用户已授予的权限。

如果您需要用户的同意,而不是管理员的同意

在某些特定情况下,应用程序需要用户同意才能获得请求的权限,并希望接受管理员代表用户授予的同意。

在这种情况下,可以在所有登录中使用scope,但是需要考虑以下重要警告:

  • 在许多组织中,user consent is disabled或受限制。如果用户无权同意为您的应用程序配置的权限,则他们将无法使用您的应用程序。
  • 即使每次用户登录之前都已征得其同意,也会在每次登录时提示用户征求同意。
  • 由于这是一个查询参数,因此,知识渊博的用户可以很轻松地在请求发出之前拦截该请求,并删除prompt=consent(并且如果先前已经同意,则不会提示他们同意)。 / li>

在这种情况下,最好在用户登录后 实施单独的授予许可体验(类似于前面所述的“通知”方案),将应用的其他功能分开Microsoft身份平台提供的同意经验中的同意要求。

答案 1 :(得分:0)

prompt=consent在用户登录后触发OAuth同意对话框,要求用户向该应用授予权限。

个人访问的应用程序需要至少一个权限,这些权限超出了他们的权限范围。

管理员将看到相同的提示显示许可,并且将看到对传统同意提示的其他控制,该控件将允许他们代表整个租户同意。

enter image description here

将阻止用户授予对该应用程序的同意,并被告知要求其管理员访问该应用程序。

enter image description here

有关更多详细信息,您可以参考此article