0

我有一个 ADLS,其中包含我想在我的网站上显示的图像。我想通过 APIM 公开它们。我在请求中发送图像名称和 SAS 令牌,我用正确的文件夹结构在实际后端请求中重写。

政策 -

    <policies>
    <inbound>
        <set-variable name="BlobName" value="@(context.Request.Url.Query.GetValueOrDefault("BlobName"))" />
        <set-variable name="sasToken" value="@(System.Net.WebUtility.UrlDecode(context.Request.Url.Query.GetValueOrDefault("sasToken")))" />
        <base />       
        <set-backend-service base-url="@{
           string blobName = context.Variables.GetValueOrDefault<string>("BlobName");
           string sasToken = context.Variables.GetValueOrDefault<string>("sasToken");
           return String.Format("https://myadls.blob.core.windows.net/UserImages/Images/{0}?{1}",blobName,sasToken);
    }" />
        <authentication-managed-identity resource="https://storage.azure.com/" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>
The SAS token - sv=2020-08-04&st=2022-02-24T04%3A17%3A53Z&se=2022-02-24T06%3A17%3A53Z&sr=c&sp=r&sig=5B6IUrj9VSh7oZSHAOKQK7fsWLun%2B%2BL7v0o1gQJHxvU%3D

由于 SAS 令牌和“&”符号,sasToken 字符串被截断为“sv=2020-08-04”

正如您在策略中看到的那样,我尝试在 c# 中将 SAS 编码为

System.Net.WebUtility.UrlEncode(dataLakeSasBuilder.ToSasQueryParameters(sharedKeyCredential).ToString());

但是, System.Net.WebUtility.UrlDecode 没有解码该值。

提前致谢。

4

1 回答 1

0

我发现在代码中对其进行编码并在策略中对字符串进行解码正在解决这个问题

Encoding.UTF8.GetString(Convert.FromBase64String(context.Request.Url.Query.GetValueOrDefault("sasToken")))
于 2022-03-03T01:42:28.200 回答