限制Azure Blob对WebApp的访问权限

时间:2018-09-04 02:41:00

标签: azure azure-storage-blobs azure-web-app-service

情况: 我们有一个天蓝色的Web应用程序和Blob存储,通过我们的Web应用程序,我们将数据写入Blob,并且当前将数据读取回去,并作为Web应用程序中的响应返回。

我们正在尝试做的事情: 试图找到一种方法来限制对Blob的访问,以便只有我们的Web应用程序才能访问它。如果我们有静态IP,则当前在防火墙设置中设置IP地址就可以正常工作(我们经常在办公室本地测试运行Web应用程序,这样就可以对Blob进行读写操作了)。但是,当我们使用Web应用程序的IP地址(从Web应用程序的跨域页面读取)时,我们不会获得相同的访问权限,并且在尝试读取/写入Blob时会出错。

问题: 有没有一种方法可以限制对Blob的访问,而不必在天蓝色的VPN(太贵)上设置VPN?我见过有人谈论使用SAS生成指向blob内容的时间有效链接,这仅允许用户通过我们的网络应用访问内容(然后会向他们提供链接)才有意义,但这并不能解决我们的网络应用无法公开访问时无法写入Blob的问题。

我们只是想错过使用blob吗?还是这是使用它们的有效方法,但是您必须通过VPN方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

SAS密钥是保护和授予对Blob存储的访问权限的正确方法。与您的看法相反,这将与私有容器一起使用。这是您可能会有所帮助的资源:

http://www.siddharthpandey.net/use-shared-access-signature-to-share-private-blob-in-azure/

也请查看Microsoft关于保护Blob存储安全的准则。这解决了您概述的许多问题,对于任何Azure PaaS开发人员来说都是必读的内容:

https://docs.microsoft.com/en-us/azure/storage/common/storage-security-guide

答案 1 :(得分:1)

另一种选择是将Azure AD身份验证与App Service上的托管身份结合使用。 在撰写本文时,此功能仍处于预览状态。

我写了一篇有关如何执行此操作的文章:https://joonasw.net/view/azure-ad-authentication-with-azure-storage-and-managed-service-identity

关键部分:

  • 启用托管身份
  • 将生成的服务主体添加到存储帐户/ blob容器中的必要角色
  • 更改代码以使用通过托管身份获取的AAD访问令牌,而不是访问密钥/ SAS令牌

使用https://www.nuget.org/packages/Microsoft.Azure.Services.AppAuthentication/1.1.0-preview获取令牌:

private async Task<string> GetAccessTokenAsync()
{
    var tokenProvider = new AzureServiceTokenProvider();
    return await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
}

使用令牌读取blob:

private async Task<Stream> GetBlobWithSdk(string accessToken)
{
    var tokenCredential = new TokenCredential(accessToken);
    var storageCredentials = new StorageCredentials(tokenCredential);
    // Define the blob to read
    var blob = new CloudBlockBlob(new Uri($"https://{StorageAccountName}.blob.core.windows.net/{ContainerName}/{FileName}"), storageCredentials);
    // Open a data stream to the blob
    return await blob.OpenReadAsync();
}