是否可以为 DataLake Gen2 存储中的目录创建 SAS 令牌?

Is it possible to create a SAS token for a directory in DataLake Gen2 storage?

我有一个 Azure 函数,它从嵌套在 ADLS Gen 2 storage container.

中的目录(命名空间)触发

示例: ADLS_AccountName/topLevelContainer/Directory1/Directory2/{name}

不幸的是,该函数需要整个 DataLake 的 Connection string 作为输入绑定(作为应用程序设置存储在 local.settings.json 中)。

函数拥有的权限太多了。

如何为给定的嵌套命名空间生成 SAS 令牌并将其用作函数的应用程序设置?

遗憾的是无法为 ADLS Gen2 存储帐户中的特定文件夹创建 SAS 令牌。但是您可以利用 Access Control List 授予对特定文件或目录的权限。

您可以将安全主体与应用程序中目录和文件的访问级别相关联。 (注意:ACL 仅适用于同一租户中的安全主体)

如果您仅使用 ACL(无 RBAC)授予权限,则要授予安全主体对文件夹的读取或写入访问权限,您需要向安全主体授予容器的执行权限,并且文件夹层次结构中指向所需 folder/file.

的每个文件夹

这是获取和设置名为 my-directory 的目录的 ACL 的示例。字符串 user::rwx,group::r-x,other::rw- 赋予所属用户读取、写入和执行权限,仅赋予所属组读取和执行权限,并赋予所有其他人读取和写入权限。

public async Task ManageDirectoryACLs(DataLakeFileSystemClient fileSystemClient)
{
    DataLakeDirectoryClient directoryClient =
        fileSystemClient.GetDirectoryClient("my-directory");

    PathAccessControl directoryAccessControl =
        await directoryClient.GetAccessControlAsync();

    foreach (var item in directoryAccessControl.AccessControlList)
    {
        Console.WriteLine(item.ToString());
    }


    IList<PathAccessControlItem> accessControlList
        = PathAccessControlExtensions.ParseAccessControlList
        ("user::rwx,group::r-x,other::rw-");

    directoryClient.SetAccessControlList(accessControlList);

}

更多细节,你可以参考这篇article

标记为正确的答案不再准确。请看https://docs.microsoft.com/en-us/dotnet/api/azure.storage.sas.datalakesasbuilder?view=azure-dotnet 从服务版本 2020-02-10 开始,可以为 ADLS Gen2 帐户中的目录生成 SAS 令牌。

自身份验证版本 2020-02-10 起支持目录范围的 SAS 令牌,请参阅 Directory scoped shared access signatures (SAS) generally available

Pythonazure-storage-file-datalake 提供函数 generate_directory_sas.

对于 TypeScript/JavaScript 检查包 @azure/storage-file-datalake 及其函数 generateDataLakeSASQueryParameters with setting { isDirectory: true } of DataLakeSASSignatureValues.

generateDataLakeSASQueryParameters(
  {
    pathName: 'my/folder',
    permissions: DirectorySASPermissions.parse('r'),
    isDirectory: true,
    ...,
    version: '2020-02-10'
  }, ...);