【发布时间】:2020-09-01 20:42:47
【问题描述】:
目前,我们有前端将文件发送到 Azure 存储帐户到特定的 blob 容器中。前端通过一个人从存储帐户获取 SAS 并将其粘贴到前端代码中,手动将 SAS 令牌放入构建中,以便它可以读取和写入存储帐户。
我们希望前端通过文件向 APIM 发送请求。然后,我们要对该文件进行哈希处理,使用该哈希作为名称并将其存储在 azure blob 存储中。我是 Azure API 管理的新手,这可能吗?好像看不到上传的文件。
在 APIM 策略中,我目前拥有对存储帐户的授权,但我不知道如何像通常在 MVC 应用中那样访问Request.Files。
我一直在寻找 https://docs.microsoft.com/ 以及 https://techcommunity.microsoft.com/ 和 SO,我什至开始查看 Google 搜索结果的第二页。我找不到任何表明这可能与否的任何东西。
这是我目前的政策。它的工作原理是前端可以点击它并通过文件并保存该文件。但我们希望对文件进行哈希处理并将该哈希用作名称以避免 Azure 存储帐户 blob 容器中的名称冲突
<policies>
<inbound>
<base />
<set-variable name="UTCNow" value="@(DateTime.UtcNow.ToString("R"))" />
<set-variable name="Verb" value="@(context.Request.Method)" />
<set-variable name="documentstorage" value="{{documentstorage}}" />
<set-variable name="documentstoragekey" value="{{documentstorageaccesskey}}" />
<set-variable name="version" value="2019-12-12" />
<set-variable name="bodySize" value="@(context.Request.Headers["Content-Length"][0])" />
<set-variable name="contentType" value="@(context.Request.Headers["Content-Type"][0])" />
<set-header name="x-ms-version" exists-action="override">
<value>@((string)context.Variables["version"] )</value>
</set-header>
<set-header name="x-ms-blob-type" exists-action="override">
<value>BlockBlob</value>
</set-header>
<set-header name="date" exists-action="override">
<value>@((string)context.Variables["UTCNow"])</value>
</set-header>
<set-header name="Authorization" exists-action="override">
<value>@{
var account = (string)context.Variables["documentstorage"];
var key = (string)context.Variables["documentstoragekey"];
var verb = (string)context.Variables["Verb"];
var container = context.Request.MatchedParameters["container"];
var fileName = context.Request.MatchedParameters["fileName"];
var dateNow = (string)context.Variables["UTCNow"];
string contentType = (string)context.Variables["contentType"];//"application/pdf";
var contentLength = (string)context.Variables["bodySize"];
var stringToSign = string.Format("{0}\n\n\n{1}\n\n{2}\n{3}\n\n\n\n\n\nx-ms-blob-type:BlockBlob\nx-ms-version:{4}\n/{5}/{6}/{7}",
verb,
contentLength,
contentType,
(string)context.Variables["UTCNow"],
(string)context.Variables["version"],
account,
container,
fileName);
string signature = "";
var unicodeKey = Convert.FromBase64String(key);
using (var hmacSha256 = new HMACSHA256(unicodeKey))
{
var dataToHmac = Encoding.UTF8.GetBytes(stringToSign);
signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
}
var authorizationHeader = string.Format(
"{0} {1}:{2}",
"SharedKey",
account,
signature);
return authorizationHeader;
}</value>
</set-header>
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
【问题讨论】:
标签: azure file http azure-api-management cloud-storage