为什么我能够访问不同租户的用户,而无需向 Azure 门户中的应用程序添加任何 API 权限?

Why I am able to access the users of a different tenant without adding any API permission to application in Azure Portal?

我在 Tenant A 中创建了一个名为 MyApp 的应用程序,具有多租户访问权限。此外,我没有在 Azure 门户中为其添加任何 API 权限。我还删除了默认的 User.Read 权限。

之后,我使用 msal4j 库实现了一个后端项目。在后端代码中,我发送了硬编码范围 Directory.ReadWrite.All.

之后,我运行 后端项目。该项目显示 Microsoft 登录在浏览器中弹出。我提供了另一个名为 BTenant B 有 16 个用户)的租户的管理员凭据。登录成功后弹出Permission Requested,上面写了关于Directory.ReadWrite.All的描述。这是正常的,因为我在后端代码中添加了 Directory.ReadWrite.All 作为范围。

作为 Tenant B 的管理员批准请求的权限后。我可以使用 Microsoft Graph APIGET /users 端点列出 Tenant B 的 16 个用户。因此,在 Tenant A 中创建的 MyApp 可以访问 Tenant B.

的用户

可是,怎么可能呢?因为我没有在 Azure 门户中为我的 MyApp 添加任何 API 权限。你可以看到上面的截图是空的。我预计在访问 GET /users 端点时会收到类似 "Insufficient privilege" 的错误。但我没有。我可以成功访问所有 16 个用户,尽管我没有在 Azure 门户中将 Directory.ReadWrite.All API 权限添加到 MyApp.

如果从后端项目发送 Directory.ReadWrite.All 作为范围足以访问 GET /users 端点。为什么我们要在 Azure 门户中使用 API permissions

Azure 门户权限就是我们所说的静态权限。 您将它们与“.default”特殊范围一起使用,例如https://graph.microsoft.com/.default.

当您在身份验证请求中指定范围时,即为动态权限。 它是较新的 v2 端点的一项功能,允许您在运行时而不是提前请求所需的权限。 这对于多租户应用程序来说非常好,因为可以更轻松地完成更新权限,并且您可以更好地实现可选功能(需要额外权限)。

文档:https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent and https://docs.microsoft.com/en-us/azure/active-directory/develop/consent-framework