是否可以为 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。
Python 包 azure-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'
}, ...);
我有一个 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。
Python 包 azure-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'
}, ...);