情况:我们有一个关于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方法这样做吗?
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
另一种选择是在App Service上使用Azure AD身份验证和托管身份。在撰写本文时,此功能仍处于预览状态。
我写了关于如何做到这一点的文章:https://joonasw.net/view/azure-ad-authentication-with-azure-storage-and-managed-service-identity。
关键部分:
使用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();
}