C# 使Azure blob Url仅可供登录用户访问
我有一个应用程序,用户可以看到存储在azure blob存储上的图像。我希望图像URL仅在用户登录时有效。复制图像url并粘贴到其他浏览器上不应起作用。我不知道该怎么做。已在使用带有过期时间的SAS。所以link可以工作半个小时。我只想让登录用户可以访问它,而不是限定时间。要访问Blob存储中的文档,它们可以是C# 使Azure blob Url仅可供登录用户访问,c#,asp.net-mvc,azure,azure-blob-storage,C#,Asp.net Mvc,Azure,Azure Blob Storage,我有一个应用程序,用户可以看到存储在azure blob存储上的图像。我希望图像URL仅在用户登录时有效。复制图像url并粘贴到其他浏览器上不应起作用。我不知道该怎么做。已在使用带有过期时间的SAS。所以link可以工作半个小时。我只想让登录用户可以访问它,而不是限定时间。要访问Blob存储中的文档,它们可以是 公开的 用密钥访问 使用SAS令牌访问 存储无法了解您的身份验证系统。如果不希望按时间绑定令牌,可以在容器中设置共享访问策略,在容器中设置到期时间,然后只参考SAS令牌中的策略。然后,您
但除此之外,您只能使用有时间限制的SAS令牌。我建议使用另一种方法—将图像检索功能作为自己的控制器(图像控制器)公开。这将允许您限制仅登录用户访问图像。如果这样做,请从容器中删除公共访问权限
这种方法的另一个好处是,如果您选择在其他地方(即不在blob存储中)托管映像,则只需更改控制器,代码的其他部分将保持不变。也就是说,控制器封装了您的映像托管逻辑。我通常使用HttpHandler 示例代码段:
public class BlobHandler : IHttpHandler, IReadOnlySessionState
{
public void ProcessRequest(HttpContext context)
{
var request = context.Request;
var response = context.Response;
var path = request.Url.AbsolutePath;
var parts = path.Split(new[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
// fetch record from db
var attachment = Attachment.FetchByUrl(parts[parts.length - 1]);
if (attachment == null)
throw new HttpException(404, "Blob not found.");
// helper method - get a blob instance, if it doesn't exist return null
var blob = CloudStorage.GetBlob(Constants.StoragePrivateContainer, attachment.BlobPath);
if (blob == null)
throw new HttpException(404, "Blob not found.");
// custom auth
if (!context.Request.IsAuthenticated)
throw new HttpException(403, "Access denied.");
var p = context.User as CustomPrincipal;
if (p == null)
throw new HttpException(403, "Access denied.");
if (!p.IsInRole(Enums.Role.Downloader))
throw new HttpException(403, "Access denied.");
blob.DownloadToStream(context.Response.OutputStream);
response.ContentType = blob.Properties.ContentType;
response.Flush();
}
public bool IsReusable => true;
}
忽略RouteConfig中的“blob”路径:
routes.IgnoreRoute("blob/{*pathInfo}");
将处理程序添加到web.config的“处理程序”部分:
<add name="Blobs" path="blob/*" verb="*" type="MyLibrary.BlobHandler" resourceType="Unspecified" preCondition="integratedMode" />
正如其他人所建议的,不要忘记将容器设置为“private”。这将如何工作?标签需要一个实际的url来显示图像。如何将其转换为其他内容?在标记中,您编写了asp.net,因此我假设您有一些应用程序正在与之通信的rest端点。在这种情况下,控制器的get端点现在将用作url:www.yoursitename.com/Images/imageid。更多详细信息-get image端点将返回一条HttpResponseMessage,其中图片字节作为内容,content.Headers.ContentType作为图像类型,例如MediaTypeHeaderValue(“图像/jpeg”)当我们首先下载blob时,内存不是很大吗?在制作您刚刚使用的示例html图像时不直接设置:获取CloudBlockBlob实例不会加载blob的内容(例如,获取元数据时需要调用FetchAttributes方法)。在HTTP处理程序中,您只需打开HTTP响应流并直接从blob内容中“填充”字节即可。我的图像URL保存在数据库表中,我正在使用EF查询它。不确定该处理程序将在何处发挥作用,请在处理程序本身中进行查询。