如何在 Azure API 管理中使用基于角色的访问控制

适用于:所有 API 管理层级

Azure API 管理依赖于 Azure 基于角色的访问控制(Azure RBAC),为 API 管理服务和实体(包括工作区)启用精细的访问管理。 本文概述 API 管理中的内置角色和自定义角色。 有关 Azure 门户中的访问管理的详细信息,请参阅 Azure 门户中的访问管理入门

注意

建议使用 Azure Az PowerShell 模块与 Azure 交互。 请参阅安装 Azure PowerShell 以开始使用。 若要了解如何迁移到 Az PowerShell 模块,请参阅 将 Azure PowerShell 从 AzureRM 迁移到 Az

内置服务角色

API 管理目前提供三个内置服务角色。 可在不同的范围(包括订阅、资源组和单个 API 管理实例)分配这些角色。 例如,如果在资源组级别将“API 管理服务读者”角色分配给某个用户,则该用户将对该资源组中的所有 API 管理实例拥有读取访问权限。

下表提供内置角色的简短说明。 可以使用 Azure 门户或其他工具(包括 Azure PowerShellAzure CLIREST API)分配这些角色。 若要详细了解如何分配内置角色,请参阅分配 Azure 角色以管理对 Azure 订阅资源的访问权限

角色 读取权限[1] 写入访问权限[2] 服务创建、删除、缩放,VPN 和自定义域配置 访问旧版发布者门户 说明
API 管理服务参与者 超级用户。 对 API 管理服务和实体(例如,API 和策略)拥有完全 CRUD 访问权限。 对旧版发布者门户拥有访问权限。
API 管理服务读取者 对 API 管理服务和实体拥有只读访问权限。
API 管理服务操作员 可以管理 API 管理服务,但不能管理实例。

[1] 对 API 管理服务和实体(例如,API 和策略)拥有读取访问权限。

[2] 对 API 管理服务和实体拥有写入访问权限,但以下操作除外:实例创建、删除和缩放;VPN 配置;以及自定义域设置。

自定义角色

如果没有任何内置角色可以满足具体需要,可以创建自定义角色,针对 API 管理实体提供更精细的访问管理。 例如,可以创建一个对 API 管理服务拥有只读访问权限,但只对某个特定 API 拥有写入访问权限的自定义角色。 若要详细了解自定义角色,请参阅 Azure RBAC 中的自定义角色

注意

若要在 Azure 门户中查看 API 管理实例,自定义角色必须包含 Microsoft.ApiManagement/service/read 操作。

Warning

不要指望通过移除 listSecrets(或其他 */listSecrets/action)权限来向已经拥有父实体写入访问权限的主体隐藏凭据。

多个 API 管理实体(例如后端、命名值和授权提供程序)可以存储凭据(例如客户端机密、API 密钥或连接字符串)。 为了防止 读者 角色读取这些凭据,它们将被省略到标准 GET 响应中,并且仅通过专用 listSecrets (或等效)操作公开。 仅向主体授予 Microsoft.ApiManagement/service/<entityType>/listSecrets/action,从而保护凭据不被只读用户访问。

但是,对实体具有 写入 访问权限的任何主体都可以通过 PUTPATCH 请求更改存储的凭据,并且这些请求的响应正文包含 完整的更新实体,包括刚刚编写的凭据。 因此,从已经授予写入访问权限的自定义角色中扣留 listSecrets 操作并不能阻止该主体获取凭据 — 它只会改变返回凭据的 API 调用。

在创作自定义角色时,应围绕实体的 写入 权限设计凭据保护,而不是围绕 listSecrets。 如果某个主体绝不能获知凭据,请不要授予其对存储凭据的实体的写入访问权限。

创建自定义角色时,从某个内置角色着手会更为轻松。 编辑属性以添加 ActionsNotActionsAssignableScopes,然后将所做的更改保存为新角色。 以下示例从“API 管理服务读者”角色着手,创建名为“计算器 API 编辑者”的自定义角色。可以在特定 API 的范围分配自定义角色。 因此,此角色仅有权访问该 API。

$role = Get-AzRoleDefinition "API Management Service Reader Role"
$role.Id = $null
$role.Name = 'Calculator API Contributor'
$role.Description = 'Has read access to Contoso APIM instance and write access to the Calculator API.'
$role.Actions.Add('Microsoft.ApiManagement/service/apis/write')
$role.Actions.Add('Microsoft.ApiManagement/service/apis/*/write')
$role.AssignableScopes.Clear()
$role.AssignableScopes.Add('/subscriptions/<Azure subscription ID>/resourceGroups/<resource group name>/providers/Microsoft.ApiManagement/service/<APIM service instance name>/apis/<API name>')
New-AzRoleDefinition -Role $role
New-AzRoleAssignment -ObjectId <object ID of the user account> -RoleDefinitionName 'Calculator API Contributor' -Scope '/subscriptions/<subscription ID>/resourceGroups/<resource group name>/providers/Microsoft.ApiManagement/service/<APIM service instance name>/apis/<API name>'

Azure 资源管理器资源提供程序操作一文提供了可以在 API 管理级别授予的权限的列表。

若要详细了解 Azure 中基于角色的访问控制,请参阅以下文章: