如何检索Blob容器ACL?Azure Storage .NET SDK访问容器报400错误
使用Azure Storage .NET SDK管理Data Lake Gen2存储的ACL时,检索Blob容器内文件、目录的ACL功能运行正常,但尝试检索容器本身的ACL时会抛出异常。
当前访问的Blob容器名为data,存储账户结构如下:
检索data/MyFolder2路径的ACL时方法可正常执行,但访问data容器根路径时调用失败,抛出的错误信息如下:
Service request failed.
Status: 400 (Value for one of the query parameters specified in the request URI is invalid.)Headers:
Server: Windows-Azure-HDFS/1.0,Microsoft-HTTPAPI/2.0
x-ms-request-id: 89561112-8b6877000000
Date: Wed, 29 Jun 2022 16:42:47 GMT
原有实现代码如下:
... string container = "data"; string folderPath = "MyFolder2"; DataLakeServiceClient dataLakeClient = new DataLakeServiceClient(mySASconnectionString); DataLakeDirectoryClient dirClient = dataLakeClient.GetFileSystemClient(container).GetDirectoryClient(directoryPath); Azure.Response<PathAccessControl> accessControlReponse = dirClient.GetAccessControl(); ...
使用存储账户所有者身份连接,持有全部所需权限,仍出现上述报错。
Data Lake Gen2的权限模型中,容器(对应SDK中的DataLakeFileSystemClient,即ADLS Gen2的文件系统)和容器内的路径(目录、文件,对应DataLakeDirectoryClient、DataLakeFileClient)分属两类不同的资源,对应两套独立的ACL操作接口。
尝试通过DataLakeDirectoryClient传入根路径/空路径查询容器ACL时,SDK会构造针对路径资源的ACL查询请求,请求URI中空路径参数不符合HDFS服务端的接口规范,直接返回400参数无效错误,与账号权限无关。
- 容器本身的ACL查询、设置操作,直接调用
DataLakeFileSystemClient提供的ACL相关方法即可,不要通过路径客户端传入空路径的方式操作。 - 修正后的查询容器ACL代码示例:
... string container = "data"; DataLakeServiceClient dataLakeClient = new DataLakeServiceClient(mySASconnectionString); // 直接获取文件系统客户端,调用对应ACL查询方法 DataLakeFileSystemClient fileSystemClient = dataLakeClient.GetFileSystemClient(container); Azure.Response<FileSystemAccessControl> containerAclResponse = fileSystemClient.GetAccessControl(); ...
- 注意区分操作对象:
DataLakeDirectoryClient、DataLakeFileClient的GetAccessControl方法仅可用于容器内部目录、文件的ACL查询,容器级ACL必须通过DataLakeFileSystemClient的对应方法操作,设置ACL逻辑同理。
内容的提问来源于stack exchange,提问作者Dušan

