针对特定用户角色的 Microsoft OAuth 授权

Microsoft OAuth authorization for specific user roles

我必须限制哪些用户可以访问 Azure 应用程序。目前,只有全局管理员可以使用此 link:

进行访问

login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=client_id_goes_here&scope=user.read.all&response_type=code&redirect_uri=https://myredirectbacklink.com/aad/auth&response_mode=query&state=portal&prompt=consent

重定向回来后,我使用 https://login.microsoftonline.com/common/oauth2/v2.0/token 并且查询包含与授权 link.

相同的范围

应用程序的流程与 Microsoft identity platform and OAuth 2.0 authorization code flow 中记录的相同。

我的问题是客户想要允许计费管理员访问他们的应用程序。我浏览了所有 Graph Permission Scopes,但找不到任何与计费管理相关的内容。

本人对微软的授权了解有限。我知道限制是按范围进行的。但是,如果它只是 link 更改或者它在 Azure 中的身份验证应用程序中(有一个但我不知道它与实际登录权限有什么关系)。

我应该换个方向看还是只是简单地改变 link? Microsoft 的文档没有太大帮助,因为它主要是关于日历和其他简单的东西。

请注意,请求通常需要管理员同意并导致用户同意提示的权限不是确保登录用户实际上是管理员的正确方法。非管理员用户可以简单地将 URL 修改为 scope=User.ReadBasic.All 并删除 prompt=consent。如果允许用户同意 User.ReadBasic.All(在许多组织中都是如此),他们将能够继续登录。 (或者,如果组织已授予“User.Read.All”的管理员许可,则非管理员用户只需删除 prompt=consent。)

如果需要确保用户是管理员,则需要明确检查目录角色分配。

您可以从三种不同的方式中选择一种来执行此操作:

  • 您可以将您的应用配置为接收 wids 声明,其中将包括用户具有活动分配的目录角色的角色模板 ID。这可能是最简单的方法。

    使用 Azure 门户,您可以在应用程序注册 >(选择您的应用程序)> 令牌配置 > + 添加组声明下执行此操作。您必须在选择中包括“目录角色”:

  • 另一种选择是向 Microsoft Graph API 请求 check which of a given list of directory roles 已分配用户:

    POST https://graph.microsoft.com/v1.0/me/checkMemberObjects
    Content-type: application/json
    
    {
        "ids": [
            "fdd7a751-b60b-444a-984c-02652fe8fa1c",
            "b0f54661-2d74-4c50-afa3-1ec803f12efe"
        ]
    }
    
  • 第三个选项是向 list the directory role assignments 发出 Microsoft Graph API 请求,授予用户:

    GET https://graph.microsoft.com/beta/roleManagement/directory/roleAssignments
            ?$filter=principalId eq '{id}'
    

所有这三种方法都涉及使用目录角色模板 ID 来标识您要检查的目录角色。它们都列在这里:https://docs.microsoft.com/azure/active-directory/roles/permissions-reference

您可能感兴趣的一些示例:

  • 应用程序管理员:9b895d92-2cd3-44c7-9d02-a6ac2d5ea5c3
  • 云应用管理员:158c047a-c907-4556-b7ef-446551a6b5f7
  • 全局管理员:fdd7a751-b60b-444a-984c-02652fe8fa1c
  • 特权角色管理员:e8611ab8-c189-46e8-94e1-60213ab1f814
  • 计费管理员:b0f54661-2d74-4c50-afa3-1ec803f12efe

(我包括前四个,因为它们是目录角色,默认情况下,允许它们同意 User.Read.All。)

如果有人需要解决方案并使用php:

您可以使用https://github.com/microsoftgraph/msgraph-sdk-php

    $accessToken = 'token from redirect back, called access_token';

    $body = [
        "ids" => [
            "fdd7a751-b60b-444a-984c-02652fe8fa1c",
            "b0f54661-2d74-4c50-afa3-1ec803f12efe"
        ]
    ];

    $graph = new Graph();
    $graph->setAccessToken($accessToken);

    $user = $graph->createRequest("post", "/me/checkMemberObjects")
            ->attachBody($body)
            ->execute();