多租户 Azure AD 非管理员登录

Multi Tenant Azure AD non admin login

我有一个现有的 Web 应用程序,我正在尝试添加 Office 365 集成。我希望所有用户都能够使用 OAuth2 登录,管理员用户能够从目录中读取用户。

所以我创建了一个 Azure AD 应用程序,并授予了 "Enable sign-on and read users profiles" 和 "Read directory data" 委托权限。

当 O365 管理员用户登录时,它按预期工作。但是当 O365 非管理员用户登录时,他们会收到错误 "AADSTS90093: Calling principal cannot consent due to lack of permissions.".

经过反复试验(文档一点也不清晰),我认为我需要将 prompt=admin_consent 附加到 auth url。通过将此附加到身份验证 URL,如果我使用管理员登录,则后续非管理员登录将按预期工作。

问题是,我不知道在我的登录页面上点击 "Login with Office 365" 按钮的用户是否是管理员。似乎第一个从 O365 域登录到应用程序的人必须是 O365 管理员,并且 auth url 必须有 prompt=admin_consent。如果非管理员尝试在管理员登录之前登录,那么他们会收到 AADSTS90093 错误,而且我的应用似乎没有任何方式可以优雅地处理这种情况。更糟糕的是 - 他们根本无法登录。

我在这里真正需要的是有 1 个登录按钮,它将让非管理员用户登录但无法访问该目录,并让管理员用户登录并有权访问该目录,但这并没有似乎有可能。 Google 有作用域的概念,但这在微软的实现中似乎没有。

我看到了 2 个可能的解决方案,但都不是很好:

  1. 在标记为 "Log in as Office 365 Administrator" 的登录页面上添加一个复选框。如果选中此项,那么我将 prompt=admin_consent 附加到 auth url。这个问题(除了弄乱我的登录页面)是它不适合非管理员在管理员登录之前尝试登录。所以大多数用户仍然无法登录 - 不太好。
  2. 创建 2 个 Azure AD 应用程序。一个同时具有 "Enable sign-on and read users profiles" 和 "Read directory data" 权限,另一个仅具有 "Enable sign-on and read users profiles" 权限。登录页面 linked 到第一个应用程序,这将允许管理员和非管理员用户随时登录。然后,在我的应用程序的配置页面上,我有一个 "Complete integration with O365" 选项,它显示 link 以使用第二个 AAD 应用程序进行身份验证。这样,我可以保证所有用户都可以执行基本登录,并且当管理员单击第二个按钮时,我可以与目录和日历集成。这样做的缺点是,即使第一个登录的用户是 o365 管理员,在第二次身份验证完成之前我也无法访问该目录。其次,我的应用程序将在客户的 AAD 应用程序列表中出现两次。

我似乎想在这里实现这样一件微不足道的事情——能够让所有用户登录,但如果管理员登录,他们就可以访问该目录。那么如何使用 AAD 应用程序实现这一目标?

您的解决方案 #1 是我们在示例中推荐的解决方案,例如 https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet 和注册控制器。截至今天,Azure AD 中的许可是 "all-or-nothing" 一揽子交易,因此需要管理员许可的应用程序必须首先得到管理员的批准。我们正在努力使同意动态化,因此您将能够在没有目录查询权限的情况下登录非管理员用户,并将该功能推迟到管理员授予同意之前——但这暂时还需要一段时间#1 是支持的方法。

如果您的应用程序请求需要租户管理员同意的权限,那么实际上只有租户管理员才能授予这些权限,因此您会看到与您遇到的错误类似的错误。

您可以通过将您的应用程序请求的权限减少到普通用户可以同意的权限来解决您的问题。

还要确保您没有传递查询参数“&prompt=admin_consent”,因为这只能由管理员完成。

https://www.gittprogram.com/question/3306112_aadsts90093-calling-principal-cannot-consent-due-to-lack-of-permissions.html