Blob SAS URI 字符在作为查询参数传递到 Azure 函数应用程序时解码

Posted

技术标签:

【中文标题】Blob SAS URI 字符在作为查询参数传递到 Azure 函数应用程序时解码【英文标题】:Blob SAS URI character decoded when passed as Query parameter to Azure Function app 【发布时间】:2021-07-28 17:49:41 【问题描述】:

我想将图像文件的 SAS URI 作为查询参数传递给 Azure Functions。 但是当我在 GET 调用中传递以下 URL 时,“sig”部分的一些字符会被解码 https://ABCD.blob.core.windows.net/images/test.jpg?sp=r&st=2021-05-06T11:30:21Z&se=2022-05-06T19:30:21Z&spr=https&sv=2020-02-10&sr=b&sig=JuPyAR%2F5WNeSVXj4G%2Fft9QDMzL%2BtXSywSS375jZpjXQ%3D

上面的网址变成 https://ABCD.blob.core.windows.net/images/test.jpg?sp=r&st=2021-05-06T11:30:21Z&se=2022-05-06T19:30:21Z&spr=https&sv=2020-02-10&sr=b&sig=JuPyAR/5WNeSVXj4G/ft9QDMzL+tXSywSS375jZpjXQ=

%2F 到 / %2B 到 + %3D 到 =

因此,当我尝试访问 blob 时,我收到 错误

System.Private.CoreLib:执行函数时出现异常:FUNCTIONNAME。 System.Net.Requests:远程服务器返回一个 错误:(403)服务器未能验证请求。确保 Authorization 标头的值正确形成,包括 签名..

我正在使用以下代码访问 URI

string image = req.Query["image"];

【问题讨论】:

【参考方案1】:

在将图像 URL 作为请求参数发送到 Azure 函数之前,请使用 base64 对整个 URL 进行编码,然后在 Azure 函数中对其进行解码,如下所示:

string image = req.Query["image"];

string base64Encoded = image;
string base64Decoded;
byte[] data = System.Convert.FromBase64String(base64Encoded);
base64Decoded = System.Text.ASCIIEncoding.ASCII.GetString(data);
log.LogInformation(image);
log.LogInformation(base64Decoded);

这样您就可以获取原始网址。我已经测试过,它对我来说非常有效:

如果您还有其他问题,请告诉我。

【讨论】:

以上是关于Blob SAS URI 字符在作为查询参数传递到 Azure 函数应用程序时解码的主要内容,如果未能解决你的问题,请参考以下文章

浅谈Azure Storage的安全性

用于复制到 Azure Blob 的 Azure SAS 授权参数是啥?

使用 SAS 将文件从 Azure Blob 存储下载到浏览器

Azure 存储帐户生成 SAS 令牌,而不是 SAS URI

尝试使用 SAS 访问 Azure blob 时收到“签名不匹配。使用的签名字符串是...”

如何将带有查询字符串的 url 作为 api 参数传递?