65.9K
CodeProject 正在变化。 阅读更多。
Home

文章:生成 SAS 令牌以访问 Azure 存储

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2020 年 2 月 8 日

CPOL

2分钟阅读

viewsIcon

3225

当您创建一个 Azure 存储帐户来在容器中存储文件时,您可以将权限设置为您想要的任何访问级别,并且您可以生成具有设置时间段的令牌来访问 Blob 存储帐户。 这就是我们今天要做的。

当您创建一个 Azure 存储帐户来在容器中存储文件时,您可以将权限设置为您想要的任何访问级别,并且您可以生成具有设置时间段的令牌来访问 Blob 存储帐户。 这就是我们今天要做的。

0. 登录到您的 Azure 帐户

首先使用 Login-AzureRmAccount 命令登录到您的 Azure 帐户。 会弹出一个提示,要求您输入电子邮件地址,然后输入密码。

<code class="language-PowerShell">Login-AzureRmAccount
</code>

1. 创建一个新的资源组

现在我们需要为我们的存储帐户创建一个新的资源组,资源组的命名可以随意。

<code class="language-PowerShell">$resourceGroupName = "NewResourceGroup"
$location = "West Europe"

New-AzureRmResourceGroup -Name $resourceGroupName -Location $location -Verbose -Force
</code>

2. 创建一个新的存储帐户

现在开始创建实际的存储帐户,此名称需要在整个 Azure 中全局唯一。 这是因为该帐户具有用于访问它的 URL,因此您需要更改下面的 storageAccountName,否则会收到错误消息。

<code class="language-PowerShell">$storageAccountName = "storageaccountsas"

New-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Location $location -SkuName "Standard_LRS"
</code>

3. 上传文件

我们将创建一个包含一些文本的 txt 文件,在我们的存储帐户中创建一个 容器(就像一个文件夹结构),然后上传我们刚刚创建的单个文件。

<code class="language-PowerShell">echo some-text  > filename.txt

$containerName = "upload"
$storageAccount = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -eq $storageAccountName})
New-AzureStorageContainer -Name $containerName -Context $storageAccount.Context -ErrorAction SilentlyContinue *>&1

$folderPath = (Get-Item -Path ".\" -Verbose).FullName
$SourcePath = $folderPath + "\filename.txt"

Set-AzureStorageBlobContent -File $SourcePath -Blob $SourcePath.Substring($folderPath.length + 1) -Container $containerName -Context $storageAccount.Context -Force | out-null
</code>

4. 生成 12 小时的 SAS 令牌

现在我们已经上传了文件,我们需要生成一个 SAS 令牌来访问我们的文件,我们将此到期时间设置为 12 小时,但可以根据需要进行更改。

<code class="language-PowerShell">Set-AzureRmCurrentStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName | out-null
$sasToken = New-AzureStorageContainerSASToken -Name $containerName -Permission r -Protocol HttpsOnly -ExpiryTime (Get-Date).AddHours(12)

$sasToken
</code>

使用 SAS 令牌进行测试

首先,让我们测试文件是否仍然是私有的,并且无法公开访问。

打开一个新的浏览器窗口,并尝试浏览到 http://storageaccountsas.blob.core.windows.net/upload/filename.txt

您应该会看到以下消息

<code class="language-XML"><Error>
<Code>ResourceNotFound</Code>
<Message>
The specified resource does not exist. RequestId:86e3247c-101e-00fa-37d7-060e24000000 Time:2018-06-18T07:41:07.3620454Z
</Message>
</Error>
</code>

Azure 没有任何透露,它只是说资源不存在,因为您没有访问它的权限。

使用新的 SAS 令牌进行测试

如果您打开一个新的浏览器并在上传文件的位置中输入新上传的文件,并在末尾添加 sasToken,我的地址是 https://storageaccountsas1.blob.core.windows.net/upload/filename.txt?sv=2017-07-29&sr=c&sig=tG3bkXUNUxGa3IwXosTgweQo7XAOChPF4%2FCdYTm4%2Fmc%3D&spr=https&se=2018-06-18T19%3A44%3A40Z&sp=r

现在应该将 filename.txt 下载到您的计算机。

完整的脚本

<code class="language-PowerShell">### 1. CREATE A NEW RESOURCE GROUP
$resourceGroupName = "NewResourceGroup"
$location = "West Europe"

New-AzureRmResourceGroup -Name $resourceGroupName -Location $location -Verbose -Force

### 2. CREATE A NEW STORAGE ACCOUNT
$storageAccountName = "storageaccountsas"

New-AzureRmStorageAccount -Name $storageAccountName -ResourceGroupName $resourceGroupName -Location $location -SkuName "Standard_LRS"

### 3. UPLOAD A FILE
echo some-text  > filename.txt

$containerName = "upload"
$storageAccount = (Get-AzureRmStorageAccount | Where-Object{$_.StorageAccountName -eq $storageAccountName})
New-AzureStorageContainer -Name $containerName -Context $storageAccount.Context -ErrorAction SilentlyContinue *>&1

$folderPath = (Get-Item -Path ".\" -Verbose).FullName
$SourcePath = $folderPath + "\filename.txt"

Set-AzureStorageBlobContent -File $SourcePath -Blob $SourcePath.Substring($folderPath.length + 1) -Container $containerName -Context $storageAccount.Context -Force | out-null

### 4. GENERATE A SAS TOKEN FOR 12 HOURS
Set-AzureRmCurrentStorageAccount -ResourceGroupName $resourceGroupName -Name $storageAccountName | out-null
$sasToken = New-AzureStorageContainerSASToken -Name $containerName -Permission r -Protocol HttpsOnly -ExpiryTime (Get-Date).AddHours(12)

$sasToken
</code>

结论

SAS 令牌可以在您的 PowerShell 脚本和 ARM 模板中用于访问存储帐户中的文件,通常其他命令将具有 -sastoken 属性。

© . All rights reserved.