Permissions &引用;需要管理员批准”;尽管授予了所有管理员权限

Permissions &引用;需要管理员批准”;尽管授予了所有管理员权限,permissions,azure-active-directory,openid-connect,Permissions,Azure Active Directory,Openid Connect,我有一个客户端和一个服务器应用程序都在AAD中注册。服务器应用程序的权限如下所示: 因此,“普通”用户无法授予的权限由管理员预先授予。另一方面,允许用户授予的所有内容不应由管理员预先授予,而是由用户通过同意屏幕授予。因此,每当用户使用该应用程序时,她都需要同意使用日历.ReadWrite和联系人.ReadWrite 客户端仅具有访问服务器API的权限: 用户尝试通过客户端应用程序应用程序id获取令牌,使用应允许访问整个服务器API的作用域(api:///.default)。但是,在执行此操作

我有一个客户端和一个服务器应用程序都在AAD中注册。服务器应用程序的权限如下所示:

因此,“普通”用户无法授予的权限由管理员预先授予。另一方面,允许用户授予的所有内容不应由管理员预先授予,而是由用户通过同意屏幕授予。因此,每当用户使用该应用程序时,她都需要同意使用
日历.ReadWrite
联系人.ReadWrite

客户端仅具有访问服务器API的权限:

用户尝试通过客户端应用程序应用程序id获取令牌,使用应允许访问整个服务器API的作用域(
api:///.default
)。但是,在执行此操作时,用户在登录后不会看到“同意”屏幕,但会看到以下错误屏幕:

我不明白,因为所有超级权限都是由管理员预先授予的,对吗?我可以通过执行以下操作之一“修复”它,但在我看来没有什么是正确的:

  • 将管理员许可授予客户端应用程序权限“用户\模拟”。同意屏幕不会显示,因为所有内容都已授予
  • 对服务器应用程序的其余权限授予管理员许可(除了“脱机访问”似乎不需要管理员许可)。同意屏幕也不显示
  • 完全删除需要管理员同意(*.All)的服务器应用权限。这一个甚至具有期望的效果,即为剩余的两个权限显示同意屏幕。但是服务器当然不能使用管理员权限
我还尝试将*.All权限替换为(已授予的)应用程序权限。这导致了类似的错误

是否可以只授予管理员权限,而由用户授予非管理员权限

编辑: 当我尝试使用管理员帐户登录我的应用程序时,我不会看到错误屏幕,但我必须同意所有权限,即使是应该授予的权限:


看起来管理员只授予部分权限不起作用,对吗?

用户当然可以同意不需要管理员同意的权限,您可以在Azure门户中进行设置

  • 以全局管理员身份登录Azure门户
  • 选择Azure Active Directory>企业应用程序>同意和 权限>用户同意设置


添加

/.default
范围通常用于v2.0端点,而
/.default
范围可以用于任何OAuth 2.0流。但是,
/.default
范围不是强制性的。它通常用于以下两种身份验证流:

  • 客户端凭据流。如果您的权限为,则必须使用
    /.default
    范围,因为应用程序权限不涉及用户,因此管理员必须同意所有应用程序权限

  • 海外建筑运营管理局流量。由于海外建筑运营管理局流程涉及中间层,您必须使用
    /.default
    预先授权所有权限


  • 由于您当前正在使用委派权限,因此不需要使用
    /。默认范围。

    是否希望用户同意不需要管理员同意的权限?是的,他们应该需要同意
    日历。ReadWrite
    联系人。ReadWrite
    。当您将
    范围设置为
    /时。在请求令牌时,默认值将要求管理员同意所有权限。为什么不使用动态权限?例如:
    api://{server-app-id}/user\u模拟
    https://graph.microsoft.com/users.Read.All
    。请注意,不要在
    范围中使用
    /。默认值
    。啊,这是一个很好的方法。我认为
    /.default
    是最简单的,因为客户端不需要知道确切的权限(客户端不调用graph api,只是在稍后由服务应用程序调用),而是使用
    /.default
    似乎必须授予所有权限,即使是管理员预先授予的权限。这一个非常明确地说:你能把它写进一个答案吗?那我就接受了。谢谢,不过已经安排好了。这是我在互联网上发现的一件事。但是如果设置不正确,即使我删除了管理员权限,它也不会工作,对吗?(参见OP中的最后一点)@Johanneseger你是说取消管理员的同意吗?不,如果我完全删除三个*.All权限,剩下的两个权限会显示同意屏幕-当然这不是一个选项,因为服务器以后需要这些权限。@johanneseger为什么要删除这三个
    *。所有
    权限?@johanneseger你能给我解释一下你的想法吗?如果您只希望普通用户同意非管理员权限,那么您可以参考我的答案。