首页 > 解决方案 > 如何确定我的应用是否获得管理员许可?

问题描述

我正在使用 Microsoft Graph 中的安全 API 编写 Web 应用程序,并且正在使用 Azure AD 进行身份验证,但访问 API 所需的权限需要管理员同意使用我的应用程序的每个租户。

如何检查租户管理员是否同意我的应用程序?这样我就知道是将用户发送到常规登录流程还是管理员同意流程。

是否可以对 Azure AD 进行 REST 调用以获取此信息?我试过使用oAuth2PermissionGrant ,但这似乎只适用于对象 ID,而且我只有我的应用程序/客户端 ID。

编辑

我对我的应用程序中需要哪些范围感到困惑,但事实证明,当我添加管理员时,只将权限委托给应用程序注册门户SecurityEvents.Read.All,并且只使用我的应用程序中的权限来请求用户的基本信息。请求访问令牌时有两种不同的结果;SecurityEvents.ReadWrite.AllUser.Read

我发现我可以使用它通过检查访问令牌范围来确定管理员是否同意我的应用程序。如果它包含SecurityEvents.Read.AllSecurityEvents.ReadWrite.All则用户可以继续在应用程序中。但是,如果这些委派权限不在范围内,那么我可以提示https://login.microsoftonline.com/common/adminconsent?client_id=<APP ID>&state=12345&redirect_uri=http://localhost/myapp/permissions管理员同意流程以请求将权限添加到租户。

谢谢@marc-lafleur,我使用管理员帐户来玩oAuth2PermissionGrant图形资源管理器,直到你指出来,我才发现鸡与蛋的场景。

标签: azure-active-directorymicrosoft-graph-api

解决方案


当您执行 Admin Consent 时,它会将以下查询参数附加到您的redirect_uri:

tenant={id}&admin_consent={bool}
  • tenant- 这是刚刚执行管理员同意的租户的全局唯一 ID。
  • admin_consent- 这是一个布尔值,表示您的管理员同意是被授予 ( true) 还是被拒绝 ( false)。

通常,您会捕获并存储这些值。当您需要确定是否需要请求管理员同意时,您可以在您的应用程序中查找它们。

存储日期/时间也是一个好主意。如果您的注册范围自最初同意后发生更改,这将允许您重新请求同意。

至于 Graph 端点,这对您没有多大帮助。由于您需要有一个有效的令牌才能调用图表,并且您需要管理员同意才能获得该令牌,因此将其锁定在图表本身将呈现鸡与蛋的场景;在他们同意之前,您将无法检查他们是否同意。

也就是说,您可以使用servicePrincipaloAuth2PermissionGrant资源确定同意:

  1. 首先,您需要id为您的应用找到servicePrinipal使用appId.

    /beta/servicePrincipals?$filter=appId eq '{appId}'
    
  2. 从对上一个查询的响应中,获取id并使用它来为您的应用程序检索oAuth2PermissionGrants

    /beta/oauth2PermissionGrants?$filter=resourceId eq '{servicePrincipal.id}'
    

请注意,这些是/beta端点,不适合生产使用。


推荐阅读