azure 使用Powershell创建SAS令牌

rsl1atfo  于 2023-01-14  发布在  Shell
关注(0)|答案(1)|浏览(194)

我希望能够使用Powershell以非常特定的方式在Datalake文件夹上创建SAS令牌。我能够在Azure门户中创建SAS令牌,但无法找到与在Powershell中完全相同的创建方法。
SAS令牌必须满足以下条件:

  • 允许访问Datalake目录
  • 使用访问策略
  • 访问策略提供开始时间或到期时间
  • 访问策略提供权限
  • SAS令牌本身提供开始时间和到期时间
  • SAS令牌本身提供权限

我使用现有的存储帐户“gfcssa 002 t”并创建了一个Datalake容器“datalake”。在这个容器中,我创建了一个文件夹结构“basefolder/testfolder”并上传了一个文件“testfile.png”:

在下一步中,我创建了一个访问策略“testpolicy”,它具有无权限无开始时间无终止时间

现在我可以开始为文件夹“basefolder/testfolder”生成SAS令牌了:

我使用帐户密钥签名(密钥1)、访问策略“testpolicy”、5个权限(读取、添加、创建、写入、列表)、开始时间“01.01.2023 00:00:00”和到期时间“01.01.2024 00:00:00”生成了SAS令牌:

我复制了生成的SAS令牌URI,在URI中的“/datalake/basefolder/testfolder”部分后面插入了“/testfile.png”,打开了一个新的私有Firefox窗口并插入了以下URI:

所以,SAS令牌按我预期的方式工作。
现在我试着用Powershell来做同一代的SAS令牌。不幸的是,要找到要使用的cmdlet并不容易。对我来说,使用cmdlet New-AzStorageBlobSASTokenDocumentation)似乎是最好的,代码如下:

$accountname="gfcssa0002t"
$accountkey="<.. key ..>"

$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"

$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey

New-AzStorageBlobSASToken `
    -Context $ctx `
    -Container $containername `
    -Blob $blob `
    -Policy $policy `
    -Protocol HttpsOnly `
    -FullUri

但只有在您至少为访问策略“testpolicy”定义了权限的情况下,这个方法才有效。如果我没有定义权限,开始时间,到期时间,我会得到错误

New-AzStorageBlobSASToken : Der Wert darf nicht NULL sein.
Parametername: accessPolicy
In C:\Users\...\Projects\Create SAS token.ps1:10 Zeichen:1
+ New-AzStorageBlobSASToken `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-AzStorageBlobSASToken], ArgumentNullException
    + FullyQualifiedErrorId : ArgumentNullException,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.NewAzureStorageBlobSasTokenCommand

当我将Start Time和Expiry Time添加到cmdlet中时,会出现相同的错误:

$accountname="gfcssa0002t"
$accountkey="<.. key ..>"

$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"

$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey

New-AzStorageBlobSASToken `
    -Context $ctx `
    -Container $containername `
    -Blob $blob `
    -Policy $policy `
    -Protocol HttpsOnly `
    -StartTime (Get-Date).AddDays(-1) `
    -ExpiryTime (Get-Date).AddDays(10) `
    -FullUri

如果我尝试使用参数“Permission”:

$accountname="gfcssa0002t"
$accountkey="<.. key ..>"

$containername="datalake"
$blob="basefolder/testfolder"
$policy="testpolicy"

$ctx = New-AzStorageContext -StorageAccountName $accountName -StorageAccountKey $accountKey

New-AzStorageBlobSASToken `
    -Context $ctx `
    -Container $containername `
    -Blob $blob `
    -Policy $policy `
    -Protocol HttpsOnly `
    -StartTime (Get-Date).AddDays(-1) `
    -ExpiryTime (Get-Date).AddDays(10) `
    -Permission racwl `
    -FullUri

错误更改为:

New-AzStorageBlobSASToken : Der Parametersatz kann mit den angegebenen benannten Parametern nicht aufgelöst werden.
In C:\Users\...\Projects\Create SAS token.ps1:10 Zeichen:1
+ New-AzStorageBlobSASToken `
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [New-AzStorageBlobSASToken], ParameterBindingException
    + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.WindowsAzure.Commands.Storage.Blob.Cmdlet.NewAzureStorageBlobSasTokenCommand

根据cmdlet的documentation,似乎没有有效的参数集来同时使用访问策略、开始时间、到期时间和权限。
这就是我没有主意的地方。

如何生成与我能够使用Azure Portal创建的SAS令牌完全相同的类型?

ncgqoxb0

ncgqoxb01#

根据您的描述,您正在尝试使用不包括任何权限、开始时间或过期时间的访问策略为Datalake文件夹创建SAS令牌。但是,使用PowerShell cmdlet New-AzStorageBlobSASToken时,要求至少为访问策略指定权限。
一种可能的解决方法是创建一个包括权限、开始时间和过期时间的访问策略。然后,使用New-AzStorageBlobSASToken cmdlet创建引用该策略的SAS令牌,并使用该SAS令牌访问所需的文件夹。
或者,你可以尝试使用Azure Data Lake Storage REST API创建按你所述方式工作的SAS令牌。这将需要额外的开发和测试,但它将使你能够更好地控制SAS令牌的特定详细信息。

相关问题