我正在使用Microsoft Graph中的安全API编写Web应用程序,并且我正在使用Azure AD进行身份验证,但访问API所需的权限需要管理员同意每个使用我的应用程序的租户。
如何检查租户管理员是否同意我的应用?这样我知道是将用户发送到常规登录流程还是管理员同意流程。
是否可以针对此信息对Azure AD进行REST调用?我尝试过使用oAuth2PermissionGrant
,但这似乎只适用于对象ID,我只有我的应用/客户端ID。
修改:
我对我的应用中需要哪些范围感到困惑,但事实证明,当我将管理员仅委派的权限(例如SecurityEvents.Read.All
和SecurityEvents.ReadWrite.All
)添加到Application Registraion Portal并且仅使用我的应用中的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,我正在使用管理员帐户在Graph Explorer中使用oAuth2PermissionGrant
,直到你指出它我没有抓到鸡与蛋的情景。
答案 0 :(得分:1)
执行管理员同意时,它会将以下查询参数附加到X %
:
redirect_uri
tenant={id}&admin_consent={bool}
- 这是刚刚执行管理员同意的租户的全球唯一ID。tenant
- 这是一个布尔值,用于指示管理员同意是被授予(admin_consent
)还是被拒绝(true
)。通常,您将捕获并存储这些值。当您需要确定是否需要请求Admin Consent时,您可以在应用程序中查找它们。
同样存储日期/时间也是个好主意。如果您的注册范围自最初同意以来已更改,则允许您重新请求同意。
对于Graph端点,这对你没什么帮助。由于您需要拥有一个有效的令牌以便调用图表,并且您需要管理员同意才能获得该令牌,因此将其锁定在Graph本身中将会出现Chicken vs. Egg场景;你无法检查他们是否同意直到他们同意。
也就是说,您可以使用false
和servicePrincipal
资源确定同意:
首先,您需要找到应用servicePrinipal
using your appId
的oAuth2PermissionGrant
。
id
从对上一个查询的回复中,抓取/beta/servicePrincipals?$filter=appId eq '{appId}'
并将其用于retrieve the oAuth2PermissionGrants
以用于您的应用。
id
请注意,这些是/beta/oauth2PermissionGrants?$filter=resourceId eq '{servicePrincipal.id}'
个终结点,不适合生产使用。
答案 1 :(得分:0)
使用您应用的值替换此链接的值将转到授权页面。
https://login.microsoftonline.com/common/adminconsent?client_id=6731de76-14a6-49ae-97bc-6eba6914391e&state=12345&redirect_uri=http://localhost/myapp/permissions
您也可以使用
https://login.microsoftonline.com/<Tenant_Id>/oauth2/authorize?client_id=<App Id>&response_type=code&redirect_uri=x-msauth-com-microsoft-testApp://com.microsoft.testApp&prompt=admin_consent
它wi ;;带您进入可以授权应用程序的页面,或者如果您没有管理员权限,则告诉您状态。