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

时间:2017-08-30 10:57:50

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

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

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

  2. 访问相同Web API的守护程序(控制台)应用程序。虽然我能够通过使用客户端凭证oauth流获取令牌,但我无法确定如何管理对守护进程的访问

  3. 一旦令牌出现问题,控制台就可以逐字访问任何API方法。

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

    相关联

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

2 个答案:

答案 0 :(得分:3)

您可以定义"角色"适用于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"
    }
  ]
}

因此,我们定义的角色只允许应用程序作为其成员。它是一个应用程序权限。另一个是可以给用户和组的角色。

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

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

After adding the role, the user will show up in the list

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

Permissions required by the Web App on the API

然后,您可以获取任一方案的角色声明中的值。

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

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

并在第二种情况中像这样:

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

答案 1 :(得分:0)

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

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

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