防止直接访问但允许从页面内下载文件

时间:2012-05-15 15:33:05

标签: c# asp.net iis permissions download

我正在开发一个网站上有一些文件,如果用户对我的条款有足够的访问权限,我只想下载它。

基本上,我有一个打开了下载链接的页面,但只有当用户具有正确的角色并且与我的数据库中的正确属性相关联时,才会显示和激活下载链接。

我面临的问题是我不希望用户能够直接访问该文件,例如,如果他们访问www.mysite.com/downloads/myfile.pdf - 我不会'我希望他们能够掌握文件,虽然我希望能够允许他们在登录后下载它并且我已经检查过它们是否符合我的自定义规则和规定。

我打算这样做,但我相信在停用权限的情况下,我无法做到这一点。

System.IO.FileInfo file = new System.IO.FileInfo(path);
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(file.FullName);
Response.End();

有可能实现我的目标吗?希望我已经充分解释了自己。

由于

3 个答案:

答案 0 :(得分:2)

我确信你的方法正确。

这是一个简单的例子:

Response.ContentType = "text/txt";
Response.AppendHeader("Content-Disposition", "attachment; filename=" + "file.txt");
Response.Write(file.ToString());
Response.End();

----编辑---- 还有其他好的样品:

http://www.dotnetscraps.com/dotnetscraps/post/4-ways-to-send-a-PDF-file-to-the-IE-Client-in-ASPNET-20.aspx

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.ContentType = "application/pdf";
        Response.Clear();
        Response.TransmitFile("UML.pdf");
        Response.End();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml" >
<head id="Head1" runat="server">
    <title>Way 1</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Send PDF" /><br />
        <br />
        This page will refresh itself with a PDF file opened in the same instance of IE itself. 
        Users will not get prompted to Save/Open/Cancel the PDF file.</div>
    </form>
</body>
</html>

答案 1 :(得分:2)

是的 - 我使用HTTP模块在大型应用程序中做了同样的事情。参见

它的工作原理是将下载文件放入一个单独的目录(在您的示例中为“downloads”目录),该目录可以作为具有自己的web.config的应用程序运行。注册HTTP模块以在该目录上运行将导致所有传入请求通过某个代码模块,您可以在其中检查相应的权限并防止未经授权的访问。该模块用作网守机制,即使它们绕过您的Web应用程序也会强制您的安全性。

来自Microsoft文章:

  

“HTTP模块的典型用途包括:安全性。因为您可以检查传入的请求,所以您的HTTP模块可以   执行自定义身份验证或其他安全检查   在请求的页面之前,调用XML Web服务或处理程序。“

这种方法的好处是你有完全的控制权。您可以将未经授权的请求重定向到某个网页以优雅地处理事物,您可以对该尝试进行自定义记录并执行各种其他操作。所以这是一个非常灵活,可定制的选项。

答案 2 :(得分:0)

如果您允许匿名,则该用户是来宾,并且ASP.NET在其自己的权限下运行。此页面标识最低权限。因此,ASP.NET可以访问该文件并对其进行服务。我所做的是有一个页面,它传递文件ID并返回文件。但我用

Response.TransmitFile(filePath);  

ASPmermissions