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

Azure AD OAuth Client credentials flow access control

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

  1. 访问Web的Web应用程序API,API基于用户角色的资源。 这是使用 authorize oauth 流程实现的,访问控制是使用 Authorize[Role="Read"] attributes

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

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

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

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

您可以在 Azure AD 的 API 清单中为用户和应用程序定义 "roles"。

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

所以你可以在你的 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->用户和组->添加用户来将角色添加到 users/groups。 Select 您想要的 users/groups 然后 select 他们的角色(如果您只有一个角色,它将被预先 select 编辑)。

你通过找到其他应用的App Registration->Required permissions->Add->找到你的API->Select->检查你之前定义的应用权限从名单。然后您可以按授予权限按钮授予应用程序角色。

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

因此 roles 声明在第一种情况下将如下所示:

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

在第二种情况下像这样:

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

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

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

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