我有一个现有的网络应用程序,我正在尝试添加Office 365集成。我希望所有用户都能够使用OAuth2登录,管理员用户可以从目录中读取用户。
因此,我创建了一个Azure AD应用程序,并授予"启用登录和读取用户配置文件"和"读取目录数据"委派权限。
当O365管理员用户登录时,它会按预期工作。但是当O365非管理员用户登录时,他们会收到错误" AADSTS90093:由于缺少权限,呼叫委托人不能同意。"。
经过多次试验和错误(文档不清楚),我想我需要将prompt = admin_consent附加到auth url。通过将此附加到身份验证URL,如果我使用管理员登录,则后续的非管理员登录将按预期工作。
问题是,我不知道用户是否要点击"使用Office 365登录"我的登录页面上的按钮是否为管理员。似乎从O365域登录应用程序的第一个人必须是O365管理员,并且auth url必须有提示= admin_consent。如果非管理员尝试在管理员之前登录,那么他们会收到AADSTS90093错误,并且我的应用程序似乎没有任何方式可以优雅地处理这种情况。更糟糕的是 - 他们根本无法登录。
我真正需要的是,有一个登录按钮,会记录非管理员用户但无法访问该目录,并且会记录管理员用户访问该目录,但这并不是似乎有可能。谷歌有范围的概念,但微软的实施似乎没有。
我看到了两个可能的解决方案,两者都不是很好:
似乎我在这里尝试实现这样一个微不足道的事情 - 能够记录所有用户,但如果管理员登录,那么他们可以访问该目录。那么你如何通过AAD应用实现这一目标呢?
答案 0 :(得分:2)
您的解决方案#1是我们在样本中推荐的解决方案,例如https://github.com/AzureADSamples/WebApp-MultiTenant-OpenIdConnect-DotNet和注册控制器。截至今天,Azure AD中的同意是一种“全有或全无”的一揽子交易,因此需要管理员同意的应用必须首先获得管理员的批准。我们正在努力使同意变得动态,因此您可以在没有目录查询权限的情况下签署非管理员用户并推迟该功能,直到管理员同意为止 - 但这仍然是相当长的一段时间因此暂时#1是受支持的方法。
答案 1 :(得分:1)
如果您的应用请求的权限需要租户管理员同意,那么只有租户管理员才能真正授予这些权限,因此您会看到类似您所拥有的错误。
您可以通过将应用程序请求的权限减少到普通用户可以同意的权限来解决您的问题。
另外请确保您没有传递查询参数"& prompt = admin_consent"因为这只能由管理员完成。