限制Azure Blob访问WebApp

问题描述 投票:1回答:2

情况:我们有一个关于azure和blob存储的网络应用程序,通过我们的网络应用程序,我们将数据写入blob,并且当前读取该数据,将其作为响应返回到web-app中。

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

问题:有没有办法限制对Web应用程序的blob访问,而无需在Azure上设置VPN(太昂贵)?我见过人们谈论使用SAS来生成blob内容的时间有效链接,这对于仅允许用户通过我们的web-app访问内容是有意义的(这会为他们提供链接),但这并不能解决我们的网络应用程序无法公开访问时无法写入blob的问题。

我们只是想错过使用blob吗?或者这是使用它们的有效方式,但您必须通过VPN方法这样做吗?

azure azure-storage-blobs azure-web-app-service
2个回答
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
投票

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

我写了关于如何做到这一点的文章: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();
}
© www.soinside.com 2019 - 2024. All rights reserved.