多租户Azure AD非管理员登录

时间:2015-08-04 21:36:55

标签: security authentication azure oauth-2.0 azure-active-directory

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

因此,我创建了一个Azure AD应用程序,并授予"启用登录和读取用户配置文件"和"读取目录数据"委派权限。

当O365管理员用户登录时,它会按预期工作。但是当O365非管理员用户登录时,他们会收到错误" AADSTS90093:由于缺少权限,呼叫委托人不能同意。"。

经过多次试验和错误(文档不清楚),我想我需要将prompt = admin_consent附加到auth url。通过将此附加到身份验证URL,如果我使用管理员登录,则后续的非管理员登录将按预期工作。

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

我真正需要的是,有一个登录按钮,会记录非管理员用户但无法访问该目录,并且会记录管理员用户访问该目录,但这并不是似乎有可能。谷歌有范围的概念,但微软的实施似乎没有。

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

  1. 在标有&#34的登录页面上添加一个复选框;以Office 365管理员身份登录"。如果选中此项,则将prompt = admin_consent附加到auth url。这个问题(除了弄乱我的登录页面)是因为它不适合非管理员尝试在管理员登录之前登录。因此大多数用户仍然无法登录 - 不是很好。
  2. 创建2个Azure AD应用。一个同时具有"启用登录和读取用户配置文件"和"读取目录数据"权限,另一个只有"启用登录和读取用户配置文件"允许。登录页面链接到第一个应用程序,这将允许管理员和非管理员用户随时登录。然后,在我的应用程序的配置页面上,我可以选择与O365"完成集成,它提供了与第二个AAD应用程序进行身份验证的链接。这样,我可以保证所有用户都可以执行基本登录,并且当管理员点击第二个按钮时,我可以与目录和日历集成。这样做的缺点是,即使第一个登录的用户是o365管理员,我也无法访问该目录,直到第二个身份验证完成为止。其次,我的应用程序将在客户AAD应用程序列表中出现两次。
  3. 似乎我在这里尝试实现这样一个微不足道的事情 - 能够记录所有用户,但如果管理员登录,那么他们可以访问该目录。那么你如何通过AAD应用实现这一目标呢?

2 个答案:

答案 0 :(得分:2)

您的解决方案#1是我们在样本中推荐的解决方案,例如https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet和注册控制器。截至今天,Azure AD中的同意是一种“全有或全无”的一揽子交易,因此需要管理员同意的应用必须首先获得管理员的批准。我们正在努力使同意变得动态,因此您可以在没有目录查询权限的情况下签署非管理员用户并推迟该功能,直到管理员同意为止 - 但这仍然是相当长的一段时间因此暂时#1是受支持的方法。

答案 1 :(得分:1)

如果您的应用请求的权限需要租户管理员同意,那么只有租户管理员才能真正授予这些权限,因此您会看到类似您所拥有的错误。

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

另外请确保您没有传递查询参数"& prompt = admin_consent"因为这只能由管理员完成。

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

相关问题