You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Python检查Azure AD主体是否有指定ADLS Gen2容器的角色分配权限?

Azure ADLS Gen2容器角色权限校验(Python实现方案)

接口返回与门户不匹配的常见原因

你之前调用接口结果异常基本是以下几个问题导致的:

  • 作用域(scope)参数填写错误:容器级别的权限查询必须指定到容器层级的完整资源ID,不能填存储账户层级的scope
  • 未正确区分角色定义ID与角色名称:Storage Blob Data Contributor的全局固定角色定义ID是ba92f5b4-2d1e-49d4-a3a5-277827c9eee5,直接按名称筛选容易匹配到自定义角色导致结果偏差
  • 未按需求过滤继承权限:默认接口会返回当前scope及父级(存储账户、资源组、订阅)继承的角色分配,如果你要和门户「此资源的角色分配」展示的结果对齐,需要额外筛选scope等于当前容器scope的条目

Python实现步骤

1. 依赖安装

首先安装需要的Azure SDK包:

pip install azure-identity azure-mgmt-authorization

2. 完整实现代码

from azure.identity import DefaultAzureCredential
from azure.mgmt.authorization import AuthorizationManagementClient

def check_container_role_assignment(
    subscription_id: str,
    resource_group_name: str,
    storage_account_name: str,
    container_name: str,
    principal_id: str,
    target_role_definition_guid: str = "ba92f5b4-2d1e-49d4-a3a5-277827c9eee5"
) -> bool:
    """
    校验指定主体是否对目标容器拥有指定角色权限
    :param principal_id: 用户/服务主体/用户组的对象ID(可从Azure AD页面查询)
    :param target_role_definition_guid: 要校验的角色定义GUID,默认是Storage Blob Data Contributor的全局GUID
    """
    # 构造容器层级的完整scope
    container_scope = f"/subscriptions/{subscription_id}/resourceGroups/{resource_group_name}/providers/Microsoft.Storage/storageAccounts/{storage_account_name}/blobServices/default/containers/{container_name}"
    # 构造完整角色定义ID
    full_role_definition_id = f"/subscriptions/{subscription_id}/providers/Microsoft.Authorization/roleDefinitions/{target_role_definition_guid}"
    
    # 初始化授权客户端
    credential = DefaultAzureCredential()
    auth_client = AuthorizationManagementClient(credential, subscription_id)
    
    # 构造筛选条件:匹配主体ID+角色定义ID
    filter_str = f"principalId eq '{principal_id}' and roleDefinitionId eq '{full_role_definition_id}'"
    
    # 查询角色分配列表
    role_assignments = list(auth_client.role_assignments.list_for_scope(container_scope, filter=filter_str))
    
    # 若仅校验是否有生效权限(包含父级继承),直接返回 len(role_assignments) > 0即可
    # 若需要和门户「此资源单独分配的角色」对齐,增加scope匹配判断
    for assignment in role_assignments:
        if assignment.scope.lower() == container_scope.lower():
            return True
    return False

# 调用示例
if __name__ == "__main__":
    has_permission = check_container_role_assignment(
        subscription_id="替换为你的订阅ID",
        resource_group_name="替换为你的资源组名",
        storage_account_name="替换为存储账户名",
        container_name="替换为容器名",
        principal_id="替换为要校验的用户/服务主体的对象ID"
    )
    print(f"权限校验结果:{has_permission}")

注意事项

  • 运行代码的身份需要拥有对应存储容器的Microsoft.Authorization/roleAssignments/read权限,一般属于所有者、用户访问管理员角色会默认拥有该权限
  • 如果要校验的是用户组权限,只要用户属于该用户组,也会命中对应的角色分配规则
  • 自定义角色的GUID可以通过订阅下的角色定义列表查询获取

内容的提问来源于stack exchange,提问作者Kyle N

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 11:45:02