在 API 管理中重写时 ADLS SAS 令牌被截断

ADLS SAS token is truncated when rewriting in API Management

我有一个 ADLS,其中包含我想在我的网站上显示的图像。 我想通过 APIM 公开它们。我在请求中发送图像名称和 SAS 令牌,我在实际后端请求中使用正确的文件夹结构重新编写了这些图像名称和 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 没有解码值。

提前致谢。

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

Encoding.UTF8.GetString(Convert.FromBase64String(context.Request.Url.Query.GetValueOrDefault("sasToken")))