我希望在Windows Azure
中提供对blob存储的访问权限,这样只有一个域可以访问container
中的blob。我发现有容器的公共,私人和共享访问。但它们不符合我的要求。在公共场合,我们可以随时从url访问blob。在私下,我们无法从网址访问,但如果我们提供存储帐户凭据,则可以从代码访问。在共享访问中,我们可以根据策略访问一段时间。
但是我需要我的网站应该访问blob-storage
中可能来自网址或代码的任何blob。但我不应该只是粘贴一个blob网址从另一个浏览器访问它。因此,除非我没有登录我的应用程序,否则我将无法访问blob存储URL。请让我知道如何实现这一目标。
答案 0 :(得分:2)
实现这一目标的最简单方法是使用有效期很短(30秒甚至更短)的Shared Access Signature (SAS)
。如您所知,SAS提供对存储资源的基于时间限制/权限的访问。所以你可以做的是保持你的blob容器的ACL Private
而不是Blob/Container
。
假设您正在使用.Net客户端库并构建MVC应用程序,您在控制器中执行的操作是使用SAS
权限在容器上创建Read
,该权限的持续时间非常短并将该SAS令牌传递给您的视图。然后,您可以将SAS令牌附加到视图中的图像URL。
控制器代码:
var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
var container = cloudStorageAccount.CreateCloudBlobClient().GetContainerReference("container");
var sas = container.GetSharedAccessSignature(new SharedAccessBlobPolicy()
{
SharedAccessExpiryTime = DateTime.UtcNow.AddSeconds(30),
Permissions = SharedAccessBlobPermissions.Read
});
ViewBag.SasToken = sas;
查看代码:
<img src="https://myaccount.blob.core.windows.net/container/myimage.png@Html.Raw(ViewBag.SasToken)" />
请注意,这不是100%万无一失,因为在SAS有效的时候,任何人都可以复制URL并获取图像,但是通过保持SAS有效的持续时间可以减轻问题,因为一旦SAS过期,即使某人有URL,他们也无法访问blob。
答案 1 :(得分:0)
我找到了解决方法。我将容器访问级别设置为专用,并在我的应用程序中编写 HTTP处理程序,以便检索blob文件,我在ProcessRequest方法中编写如下所示的逻辑。
<强>处理程序强>
public void ProcessRequest(HttpContext context)
{
// Get the file name.
string fileName = string.Empty;
string blobContainerName = string.Empty;
if (HttpContext.Current.Session["UserName"] != null)
{
if (context.Request.QueryString["filename"] != null)
{
fileName = context.Request.QueryString["filename"];
}
if (context.Request.QueryString["source"] != null)
{
blobContainerName = context.Request.QueryString["source"];
}
// Get the blob from blob storage.
var storageAccount = CloudStorageAccount.Parse(
CloudConfigurationManager.GetSetting("StorageConnectionString"));
var blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference(blobContainerName);
// Retrieve reference to a blob named "FlexpathBlob".
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
// Read blob content to response.
context.Response.Clear();
try
{
blockBlob.FetchAttributes();
context.Response.ContentType = blockBlob.Properties.ContentType;
blockBlob.DownloadToStream(context.Response.OutputStream);
}
catch (Exception ex)
{
context.Response.Write(ex.ToString());
}
context.Response.End();
}
else {
context.Response.Write("You are not authorized to view this file.");
}
}
从视图中访问
查看强>
<img id="imgVehicleImage1790" src="/Handlers/FileReciever.ashx?source=dealerinventory&filename=1790_3b733b4e-b692-4650-95a6-855eb55145c4.png" style="border-width: 0px;width:208px;height:126px;">
这对我来说很好。我可以访问所有图像和其他blob文件。当我尝试从blob url访问时,它显示未经授权的访问。谢谢!