Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使Azure blob Url仅可供登录用户访问_C#_Asp.net Mvc_Azure_Azure Blob Storage - Fatal编程技术网

C# 使Azure blob Url仅可供登录用户访问

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令牌中的策略。然后,您

我有一个应用程序,用户可以看到存储在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查询它。不确定该处理程序将在何处发挥作用,请在处理程序本身中进行查询。