azure-active-directory - 如何确定我的应用是否获得管理员许可?
问题描述
我正在使用 Microsoft Graph 中的安全 API 编写 Web 应用程序,并且正在使用 Azure AD 进行身份验证,但访问 API 所需的权限需要管理员同意使用我的应用程序的每个租户。
如何检查租户管理员是否同意我的应用程序?这样我就知道是将用户发送到常规登录流程还是管理员同意流程。
是否可以对 Azure AD 进行 REST 调用以获取此信息?我试过使用oAuth2PermissionGrant
,但这似乎只适用于对象 ID,而且我只有我的应用程序/客户端 ID。
编辑:
我对我的应用程序中需要哪些范围感到困惑,但事实证明,当我添加管理员时,只将权限委托给应用程序注册门户SecurityEvents.Read.All
,并且只使用我的应用程序中的权限来请求用户的基本信息。请求访问令牌时有两种不同的结果;SecurityEvents.ReadWrite.All
User.Read
- 如果管理员没有同意我的应用程序,那么访问令牌将只包含
User.Read
范围。 - 如果管理员已同意,则访问令牌将包含
User.Read
、SecurityEvents.Read.All
和SecurityEvents.ReadWrite.All
委派范围。即使我的应用程序只请求User.Read
.
我发现我可以使用它通过检查访问令牌范围来确定管理员是否同意我的应用程序。如果它包含SecurityEvents.Read.All
,SecurityEvents.ReadWrite.All
则用户可以继续在应用程序中。但是,如果这些委派权限不在范围内,那么我可以提示https://login.microsoftonline.com/common/adminconsent?client_id=<APP ID>&state=12345&redirect_uri=http://localhost/myapp/permissions
管理员同意流程以请求将权限添加到租户。
谢谢@marc-lafleur,我使用管理员帐户来玩oAuth2PermissionGrant
图形资源管理器,直到你指出来,我才发现鸡与蛋的场景。
解决方案
当您执行 Admin Consent 时,它会将以下查询参数附加到您的redirect_uri
:
tenant={id}&admin_consent={bool}
tenant
- 这是刚刚执行管理员同意的租户的全局唯一 ID。admin_consent
- 这是一个布尔值,表示您的管理员同意是被授予 (true
) 还是被拒绝 (false
)。
通常,您会捕获并存储这些值。当您需要确定是否需要请求管理员同意时,您可以在您的应用程序中查找它们。
存储日期/时间也是一个好主意。如果您的注册范围自最初同意后发生更改,这将允许您重新请求同意。
至于 Graph 端点,这对您没有多大帮助。由于您需要有一个有效的令牌才能调用图表,并且您需要管理员同意才能获得该令牌,因此将其锁定在图表本身将呈现鸡与蛋的场景;在他们同意之前,您将无法检查他们是否同意。
也就是说,您可以使用servicePrincipal
和oAuth2PermissionGrant
资源确定同意:
首先,您需要
id
为您的应用找到servicePrinipal
使用appId
./beta/servicePrincipals?$filter=appId eq '{appId}'
从对上一个查询的响应中,获取
id
并使用它来为您的应用程序检索oAuth2PermissionGrants
。/beta/oauth2PermissionGrants?$filter=resourceId eq '{servicePrincipal.id}'
请注意,这些是/beta
端点,不适合生产使用。
推荐阅读
- c# - System.Text.Json 序列化 Unicode 字符(如表情符号)的问题
- .net - 为什么为日期类型对象分配一个值不能正确地获得它的值?
- python - 如何生成包含连续数字和字母混合的列表?
- javascript - Three.js中点的局部到全局(反之亦然)矩阵变换
- autodesk-forge - 为什么我的线宽不显示在 2D Forge Viewer 中?
- python - 与其他表达式进行 OR 运算时,Python 正则表达式与组不匹配
- php - MethodNotAllowedHttpException 在另一个类服务中调用 Model::create
- java - 使用 IP 地址到远程服务器的 JDBC 连接
- c# - 如何使用 C# selenium 绕过这层 javascript?
- python - Django分页与输入查询不匹配