3

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

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

我面临的问题是我不希望用户能够直接访问该文件,例如,如果他们访问 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();

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

谢谢

4

3 回答 3

2

我相信你在正确的方式。

这是一个简单的例子:

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

---- EDIT ---- 还有其他很好的示例:

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>
于 2012-05-15T15:38:48.533 回答
2

是的——我在一个大型应用程序中使用 HTTP 模块做了同样的事情。看

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

来自微软的一篇文章:

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

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

于 2012-05-15T15:39:01.123 回答
0

如果您允许匿名用户是访客并且 ASP.NET 在它自己的权限下运行。此页面标识最低权限。因此 ASP.NET 可以访问该文件并将其服务器化。我所做的是有一个页面通过文件 ID 并返回文件。但我用

Response.TransmitFile(filePath);  

ASP权限

于 2012-05-15T18:50:21.380 回答