多租户 Azure AD 非管理员登录

3
我有一个现有的Web应用程序,我正在尝试添加Office 365集成。我希望所有用户都能够使用OAuth2登录,并且管理员用户能够从目录中读取用户。
所以我创建了一个Azure AD应用程序,并授予了“启用登录和读取用户配置文件”和“读取目录数据”委派权限。
当O365管理员用户登录时,它按预期工作。但是当非管理员用户登录时,他们会收到错误“AADSTS90093:由于缺乏权限,调用主体无法同意。”。
经过多次尝试(文档远非清晰),我发现需要将prompt = admin_consent附加到auth url。通过将其附加到auth URL,如果我使用管理员登录,那么随后的非管理员登录将按预期工作。
问题是,我不知道即将单击我的登录页面上的“使用Office 365登录”按钮的用户是否为管理员。似乎从O365域登录应用程序的第一个人必须是O365管理员,并且auth url必须具有prompt = admin_consent。如果在管理员之前尝试登录非管理员,则会收到AADSTS90093错误,我的应用程序似乎没有任何优雅处理此场景的方法。更糟糕的是,他们根本无法登录。
我真正需要的是一个登录按钮,将非管理员用户登录,但没有访问目录,并将管理员用户登录带有目录访问权限,但这似乎是不可能的。Google有范围的概念,但在Microsoft的实现中似乎缺少这个。
我看到两个潜在的解决方案,但都不太好:
1. 在登录页面上添加一个带有“作为Office 365管理员登录”的复选框。如果选中此复选框,则将prompt = admin_consent附加到auth url。这样做的问题(除了使我的登录页面混乱)是它无法满足管理员之前尝试登录的非管理员。所以大多数用户仍然无法登录-不太好。
2. 创建2个Azure AD应用程序。其中一个具有“启用登录和读取用户配置文件”和“读取目录数据”权限,另一个仅具有“启用登录和读取用户配置文件”权限。登录页面链接到第一个应用程序,它允许管理员和非管理员用户随时登录。然后,在我的应用程序中的配置页面上,我有一个“完成与O365的集成”的选项,它提供了一个链接,用于验证第二个AAD应用程序。这样,我可以保证所有用户都可以执行基本的登录,并且当管理员单击第二个按钮时,我可以与目录和日历集成。这样做的缺点是,即使第一个登录的用户是o365管理员,我也无法访问目录,直到完成第二个身份验证。其次,我的应用程序将在客户的AAD应用程序列表中显示两次。

看起来我在这里尝试实现一个微不足道的事情 - 能够登录所有用户,但如果管理员登录,则可以访问目录。那么如何使用AAD应用程序实现此目标?

2个回答

2

我们建议您采用解决方案#1,例如https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet和注册控制器中的示例。截至今天,在Azure AD中的同意是一个“全有或全无”的打包交易,因此需要管理员同意的应用程序必须先得到管理员的批准。我们正在努力使同意动态化,这样您将能够在没有目录查询权限的非管理员用户登录并推迟该功能,直到管理员同意 - 但这仍需要一些时间,因此目前支持使用解决方案 #1。


感谢您的迅速回复。如果我们选择方案#1,那么大多数用户将无法登录应用程序,直到管理员用户首先登录。这对我们来说不是可行的解决方案。除了上述列出的原因外,是否有其他原因不选择方案#2? - Gwyn Howell
使用多个身份验证来访问同一个 Web 应用程序并不是授权库的设计目的。您需要深入挖掘可扩展性点,以进行即时客户端 ID 替换,您将拥有不同的会话标识符,不兼容的令牌缓存等等...我无法保证它能够可靠地工作。当然,还有您提到的管理开销。您的情况绝对有效,这就是为什么我们正在研究动态同意的原因,但这不是一个小的变化(当前模型在系统中根深蒂固),因此需要时间。 - vibronet
我的应用程序是用Python编写的,所以我没有使用任何.NET库。我想今天尝试一下,看看效果如何。感谢您的帮助。 - Gwyn Howell
@GwynHowell 为什么不能像“如果用户尚未同意,则请求用户同意”一样直观呢?现在的用户体验是,你会收到一个错误提示,然后你必须进行特殊查询,以便它会要求你同意,然后你才能返回并登录。 - orad
因为您不能拥有一个单一的AAD应用程序,允许非管理员和管理员登录。我通过创建两个具有不同权限的单独的AAD应用程序来解决这个限制 - 一个用于非管理员,另一个用于管理员。 - Gwyn Howell
感谢GwynHowell的回答。我的意思是在我的问题中标记@vibronet。对此我很抱歉。 - orad

1
如果您的应用程序请求需要租户管理员同意的权限,则只有租户管理员才能实际授予这些权限,因此您将看到类似于您遇到的错误。
您可以通过减少应用程序请求的权限,仅限普通用户可以同意的权限来解决问题。
还要确保您没有传递查询参数"&prompt=admin_consent",因为只有管理员才能执行此操作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接