Azure Blob返回从门户网站上运行的Azure函数禁止的403

时间:2018-09-01 06:16:34

标签: azure azure-functions azure-storage-blobs

我已经阅读了几则有关类似查询的帖子,例如this one,但我一直收到403。

最初,我在Visual Studio中编写了代码-访问存储Blob的azure函数-一切正常。但是,当我部署相同的功能时,它将抛出403!我尝试了建议,移至x64等位置并删除了其他文件,但没有任何效果。

请注意-我已多次验证-访问密钥正确且有效

所以,我做了以下所有事情

(1)-我在Portal本身上编写了一个简单的Azure函数(以排除部署怪癖),瞧,同样是403!

var storageConnection = "DefaultEndpointsProtocol=https;AccountName=[name];AccountKey=[key1];EndpointSuffix=core.windows.net";
var cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
var blobClient = cloudStorageAccount.CreateCloudBlobClient();

var sourceContainer = blobClient.GetContainerReference("landing");
CloudBlockBlob blob = container.GetBlockBlobReference("a.xlsx");

using (var inputStream = new MemoryStream())
{
    log.Info($"Current DateTime: {DateTime.Now}");
    log.Info("Starting download of blob...");
    blob.DownloadToStream(inputStream); // <--- 403 thrown here!!
    log.Info("Download Complete!");
}

(2)-我通过记录日期时间及其在功能服务器上的UTC验证了日期

(3)-我使用了在门户网站上生成的Account SAS密钥,但是仍然提供了403。我已经在SAS密钥生成后等待了30秒以上,以确保SAS密钥能够传播。

var sasUri = "https://[storageAccount].blob.core.windows.net/?sv=2017-11-09&ss=b&srt=sco&sp=rwdlac&se=2019-07-31T13:08:46Z&st=2018-09-01T03:08:46Z&spr=https&sig=Hm6pA7bNEe8zjqVelis2y842rY%2BGZg5CV4KLn288rCg%3D";
StorageCredentials accountSAS = new StorageCredentials(sasUri);
var cloudStorageAccount = new CloudStorageAccount(accountSAS, "[storageAccount]", endpointSuffix: null, useHttps: true);

// rest of the code same as (1)

(4)-我在代码中即时生成了SAS密钥,但再次生成了403。

static string GetContainerSasUri(CloudBlobContainer container)
{
    //Set the expiry time and permissions for the container.
    //In this case no start time is specified, so the shared access signature becomes valid immediately.
    SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
    sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5);
    sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(25);
    sasConstraints.Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Add | SharedAccessBlobPermissions.Create;

    //Generate the shared access signature on the container, setting the constraints directly on the signature.
    string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);

    //Return the URI string for the container, including the SAS token.
    return container.Uri + sasContainerToken + "&comp=list&restype=container";
}

并将以上内容用作

var sourceContainer = blobClient.GetContainerReference("landing");
var sasKey = GetContainerSasUri(sourceContainer);
var container = new CloudBlobContainer(new Uri(sasKey));

CloudBlockBlob blob = container.GetBlockBlobReference("a.xlsx"); 

我完全无法理解为什么在Visual Studio中运行代码,访问云中的存储(而不是仿真器)时代码可以完美运行,但是当在门户上部署或显式运行代码时却无法运行。

我在这里想念什么?

1 个答案:

答案 0 :(得分:1)

由于您已经排除了许多可能的原因,所以我可以重现您的问题的唯一方法是在存储帐户上配置防火墙。

在本地代码可以正常工作,因为您可能已将本地IP添加到白名单中,而“功能”省略了此步骤。在门户网站上,转到平台功能下的资源浏览器。搜索outboundIpAddresses并将那些(通常是四个)IP添加到“存储帐户白名单”中。

如果添加了功能IP但仍然出现403错误,请检查“存储和功能”应用的位置。如果他们生活在同一地区(就像美国中部地区一样),那么两个人将通过内部方式进行交流,而无需经过outboundIpAddresses。如果您的计划中需要防火墙,我可以提供的解决方法是在其他区域中创建存储。否则,只允许所有网络进行存储。