Azure AD OAuth 客户端凭据流访问控制

Ano*_*oop 4 oauth-2.0 asp.net-web-api azure-active-directory azure-ad-graph-api

我正在使用 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

juu*_*nas 5

可以在 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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以向用户授予 Read things 角色,并为守护程序控制台应用程序授予 Read all things 应用程序权限。你实现了这两种情况:)

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

添加角色后,用户会出现在列表中

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

Web 应用程序在 API 上所需的权限

然后,您将获得任一场景的角色声明中的值。

因此,在第一个场景中,角色声明将如下所示:

"roles": [
    "Things.Read"
  ],
Run Code Online (Sandbox Code Playgroud)

在第二个场景中是这样的:

"roles": [
    "Things.Read.All"
  ],
Run Code Online (Sandbox Code Playgroud)

  • 啊...您的应用程序可能是本机应用程序!他们无法获得应用程序权限,因为他们无法保密。 (2认同)