在 PowerShell 中仅使用 SAS 令牌上传

Posted

技术标签:

【中文标题】在 PowerShell 中仅使用 SAS 令牌上传【英文标题】:Using Only a SAS Token To Upload in PowerShell 【发布时间】:2021-10-31 23:28:36 【问题描述】:

我有一个SAS Token 的表单:

https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw

我正在尝试在 Powershell 中使用 Az 提供的 Cmdlet 将内容上传到此 blob。我找不到只需要上述 SAS 令牌和要上传的文件的 API。

阅读此reddit post 似乎我的选择是:

    解析出StorageAccountName(示例中为name)、Container(示例中为container)和SASToken(示例中为sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw),然后使用New-AzStorageContext/@ 987654335@。这或多或少是这个 *** 帖子 (Connect to Azure Storage Account using only SAS token?) 中的答案 使用Invoke-WebRequest 或其亲属基本上自己执行 REST 调用。

我想尽可能多地使用Az 提供的 cmdlet,所以从选项 1 开始,似乎没有 API 来解析这个,我能找到的最接近的是这个 *** 帖子 (Using SAS token to upload Blob content) 说话关于使用CloudBlockBlob,但目前尚不清楚我是否可以在 PowerShell 中使用此类。

为此,我创建了一个看起来可以工作但很可能很脆弱的正则表达式,有没有更好的方法来做到这一点?

$SASUri = https://name.blob.core.windows.net/container?sv=2015-04-05&sr=b&sig=abc123&se=2017-03-07T12%3A58%3A52Z&sp=rw
$fileToUpload = 'Test.json'

$regex = [System.Text.RegularExpressions.Regex]::Match($SASUri, '(?i)\/+(?<StorageAccountName>.*?)\..*\/(?<Container>.*)\?(?<SASToken>.*)')
$storageAccountName = $regex.Groups['StorageAccountName'].Value
$container = $regex.Groups['Container'].Value
$sasToken = $regex.Groups['SASToken'].Value

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken
Set-AzStorageBlobContent -File $fileToUpload -Container $container -Context $storageContext -Force

重述问题

    是否有一个Az Cmdlet 采用 SAS URI 和 SAS 令牌来允许上传? (如果没有)是否有 API 可以解析 SAS URI + SAS Token?

【问题讨论】:

【参考方案1】:

考虑到 $SASUri 是一个 URI,您可以使用以下方式获取 System.Uri 对象:

$uri = [System.Uri] $SASUri

一旦你有了它,你就可以使用类似的方式获取容器名称和 SAS 令牌:

$storageAccountName = $uri.DnsSafeHost.Split(".")[0]
$container = $uri.LocalPath.Substring(1)
$sasToken = $uri.Query

之后你的代码应该可以正常工作了:

$storageContext = New-AzStorageContext -StorageAccountName $storageAccountName -SasToken $sasToken
Set-AzStorageBlobContent -File $fileToUpload -Container $container -Context $storageContext -Force

【讨论】:

谢谢!一个小问题,您似乎需要从 $sasToken 中删除 ? ,否则看起来很可靠!

以上是关于在 PowerShell 中仅使用 SAS 令牌上传的主要内容,如果未能解决你的问题,请参考以下文章

使用 Blob 特定的 SAS 令牌连接和更新 Azure Blob

如何使用 Powershell 从 csv 文件中仅读取一列

是否可以在 Spring Security 中仅使用刷新令牌请求访问令牌 oauth2?没有基本身份验证?

使用 PowerShell 生成 Azure 存储帐户 SAS 密钥

使用PowerShell创建Azure Storage的SAS Token访问Azure Blob文件

错误:尚未正确初始化 Azure PowerShell 上下文。请导入模块并重试