【问题标题】:Azure AD OAuth Client credentials flow access controlAzure AD OAuth 客户端凭据流访问控制
【发布时间】:2018-02-08 01:29:04
【问题描述】:

我正在使用 Azure AD OAuth2 授权来保护我的 Web API。现在我需要支持两个 OAuth2 场景(流程)-

  1. Web 应用程序访问 Web API,基于用户角色的 API 将服务于资源。 这是使用授权 oauth 流程实现的,访问控制是使用 Authorize[Role="Read"] 属性完成的

  2. 访问同一 Web API 的守护程序(控制台)应用程序。虽然我可以通过使用客户端凭据 oauth 流来获取令牌,但我无法弄清楚如何管理对守护进程的访问

一旦令牌发出,控制台就可以直接访问任何 API 方法。

范围 - 当 grant_type 为“client_credentials”时,范围不是 /token 端点的参数 角色 - 不能使用它,因为它与用户相关联

有人可以建议,我们如何在客户端凭据流中进行访问控制?以及如何同时满足要求 1 和 2

【问题讨论】:

    标签: asp.net-web-api oauth-2.0 azure-active-directory azure-ad-graph-api


    【解决方案1】:

    您可以在 Azure AD 的 API 清单中为用户和应用程序定义“角色”。

    如果您想知道,应用程序角色实际上是应用程序权限。

    因此,您可以在 API 清单中包含类似的内容(为清楚起见,删除了其他属性):

    {
      "appRoles": [
        {
          "allowedMemberTypes": [
            "Application"
          ],
          "displayName": "Read all things",
          "id": "32028ccd-3212-4f39-3212-beabd6787d81",
          "isEnabled": true,
          "description": "Allow the application to read all things as itself.",
          "value": "Things.Read.All"
        },
        {
          "allowedMemberTypes": [
            "User"
          ],
          "displayName": "Read things",
          "id": "ef8d02ff-eee1-6745-9387-96587c358783",
          "isEnabled": true,
          "description": "Allow the user to read things.",
          "value": "Things.Read"
        }
      ]
    }
    

    所以我们定义了一个角色,它只允许应用程序作为其成员。这是一个应用程序权限。另一个是可以赋予​​用户和组的角色。

    然后,您可以为用户授予“读取所有内容”角色,并为守护程序控制台应用程序授予“读取所有内容”应用程序权限。你实现了这两种情况:)

    您可以通过转到企业应用程序->您的 API->用户和组->添加用户来将角色添加到用户/组。选择您想要的用户/组,然后为他们选择一个角色(如果您只有一个,它将被预先选择)。

    您可以通过查找其他应用程序的应用程序注册->所需权限->添加->查找您的 API->选择->从列表中检查您之前定义的应用程序权限来添加应用程序权限。然后您可以按“授予权限”按钮授予应用角色。

    然后,您可以在任一场景的角色声明中获取值。

    所以 roles 声明在第一个场景中将如下所示:

    "roles": [
        "Things.Read"
      ],
    

    在第二种情况下是这样的:

    "roles": [
        "Things.Read.All"
      ],
    

    【讨论】:

    • 这将在场景 1 中工作,但它是如何工作的客户端凭据流程?假设我有一个客户端应用程序应该具有“读取”访问权限,而另一个需要“写入”访问权限我在哪里指定映射?有没有办法可以在 azure portal 中定义这种访问?或者客户端可以在令牌请求中请求这个读/写权限吗?
    • 在您将应用程序权限添加到 Azure AD 中的控制台应用程序并授予它之后,您使用客户端凭据返回的令牌应包含角色。
    • 啊...您的应用可能是原生应用!他们无法获得应用权限,因为他们无法保守秘密。
    • 如果您已在控制台应用程序中授予应用程序权限并授予它,那么它应该会显示出来。没有理由不这样做。
    • 是的。添加应用程序权限仅表示此应用程序愿意这样做。它仍然需要管理员批准才能真正获得分配给它的角色。
    【解决方案2】:

    您可以使用您在客户端获得的令牌获得您提到的应用程序角色。但是在服务器端(受保护的 API 端),没有办法看到 Roles 声称要授权。

    使用用户/角色,您可以在清单文件中定义的用户和角色之间创建映射。所以 UI 和 API 会知道要授权的用户角色。

    使用 App/Roles,无法在 Azure 门户上创建映射 clientId/clientSecret 到 Manifest 中定义的 AppRole。

    【讨论】:

      猜你喜欢
      • 2019-12-03
      • 2023-03-25
      • 2020-02-28
      • 2019-12-15
      • 2021-04-10
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2019-06-16
      相关资源
      最近更新 更多