C# 在客户端呈现PDF文件,而不暴露原始路径以防止下载

C# 在客户端呈现PDF文件,而不暴露原始路径以防止下载,c#,jquery,asp.net-mvc,C#,Jquery,Asp.net Mvc,当前限制直接访问文件的可能方式是将文件放在App_数据文件夹中。但如果我使用app_data folder,它将阻止直接的浏览器访问和HTML呈现。我希望允许App_数据中的文件以编程方式在客户端呈现,并具有某种授权,即:会话值 现在,如果我将上传的文件移动到其他文件夹并以html格式呈现,它将起作用,但它也将公开对文件的直接访问,这不是必需的&在我的场景中是一个安全循环漏洞 到目前为止我都试过了 1.我已经实现了通过直接url限制文件下载。使用FileResult方法。但我仍然无法在客户端(J

当前限制直接访问文件的可能方式是将文件放在App_数据文件夹中。但如果我使用app_data folder,它将阻止直接的浏览器访问和HTML呈现。我希望允许App_数据中的文件以编程方式在客户端呈现,并具有某种授权,即:会话值

现在,如果我将上传的文件移动到其他文件夹并以html格式呈现,它将起作用,但它也将公开对文件的直接访问,这不是必需的&在我的场景中是一个安全循环漏洞

到目前为止我都试过了
1.我已经实现了通过直接url限制文件下载。使用FileResult方法。但我仍然无法在客户端(Jquery)中呈现文件

一种方法是将文件作为字节[](或任何其他格式)返回,然后在客户端从此字节[]重新构造或重新创建文件


你还可以创建一个可供客户端访问的临时位置,在那里复制文件并从那里提供服务,在文件提供后删除文件(当然在性能方面不是最佳做法,但在安全方面非常好,因为特定URL不会工作两次)

我也遇到过同样的情况,经过研究,我从这个答案中找到了这个解决方案

使用这个答案,我只需创建一个IHTTPHANDLER即可拦截发送到App_Data或任何您想要保护的文件夹的所有请求

IHTTPHANDLER

    public class PdfHandler : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }
        public void ProcessRequest(HttpContext context)
        {
            /*
                Validate Requests here and then return your PDF File
            */
            var requestFilePath = context.Requests.AppRelativeCurrentExecutionFilePath;
            context.Response.ContentType = "application/pdf";
            string filePath = HttpContext.Current.Server.MapPath(path);
            context.Response.TransmitFile(filePath);
        }
    }
同时在Web.Config中添加引用

<system.webServer>
  <handlers>
    <add name="cplFiles" verb="*" path="*.pdf" type="YourProject.Models.PdfHandler , YourProject" resourceType="File" />
  </handlers>
</system.webServer>

在我的例子中,如果文件大小大于5GB,5GB的PDF书是正常的。HTTPHANDLER是救世主