阻止用户访问文件但允许管理员访问 asp.net IIS C#

block access to files for users but allow access for admins asp.net IIS C#

我有一个网站,用户可以创建为他们存储为 PDF 的文件。我想阻止普通用户直接访问这些文件,但仍允许管理员直接访问。这样随机用户就不能只输入 www.website.com/files/hello.pdf 之类的内容就可以访问任何用户的文件。但我希望管理员能够访问该文件。

我曾尝试在 IIS 中隐藏段,但这会为所有人(包括管理员)阻止整个文件夹。我试图弄清楚如何使用请求过滤规则,但我似乎无法正确使用它。

用户的角色存储为 Session[]。如果该会话是“userA”角色,那么他们就是普通用户,我不希望他们直接访问该文件。但是,如果该会话是“userB”角色,那么他们就是管理员,我希望他们可以直接访问该文件。例如www.website.com\files\hello.pdf

我的另一个问题是 PDF 文件位于 GridView 中,因此多个文件将嵌入到多行中。我已经弄清楚如何通过将 PDF 信息转换为 Base64 然后将该数据插入到嵌入标记的源中来将 PDF 嵌入到 ASPX 中。现在的问题是,当从 GridView 加载超过 10 行时,这对浏览器来说是一些繁重的工作。所以它有效,但我想有一种内存效率更高的方法可以做到这一点。

这是我目前所做的

<embed src='<%# Eval("pdfBytes")%>' type="application/pdf" width="910px" height="1100px"/>

 string FilePath = Server.MapPath(FileLocation);
                            WebClient User = new WebClient();
                            Byte[] FileBuffer = User.DownloadData((FilePath));
                            if (FileBuffer != null)
                            {
                                
                                base64PDF = "data:application/pdf;base64, " + System.Convert.ToBase64String(FileBuffer, 0, FileBuffer.Length);

                                dt.Rows[i]["pdfBytes"] = base64PDF + "  #>";


                            }


                        }

关于如何做到这一点有什么想法吗?请帮忙

这是您必须遵循的步骤。

  1. 您将文件保存在 App_Data 目录下,任何用户都无法访问该目录。只有池可以访问那里的任何数据,因此您可以在后面的代码中保存和阅读,但不能通过任何 url
  2. 直接访问它
  3. 如果您的用户具有此角色,您可以创建一个 returns 该文件的处理程序(基于您在 url 上发送的某些参数)。

例如,您创建一个 download.ashx,检查用户是否具有角色及其身份验证,添加正确的 headers 和内容类型,禁用缓存...

context.Response.ContentType = "application/pdf";
context.Response.AppendHeader("Content-disposition", "attachment; filename=" + FullFileName);   

并添加一些代码来读取受保护的文件并将其发送到响应输出流。

我无法在网络上找到明确的答案,但在很多社区的帮助下,我能够将这些放在一起作为我的问题的答案。

在我有 GridView 的 ASPX 上,我放置了这段代码

<iframe id="iframePDF" runat="server"  width="910px" height="1100px" scrolling="no" frameborder="0" ></iframe>

在我有 Gridview 的 ASPX.CS 中,我从 SQL 填充了 GridView,并将这些代码放入 GridViewRowEventHandler。

if (e.Row.RowType == DataControlRowType.DataRow)
        {

            using (SqlConnection con = new SqlConnection(strcon))
            {
                if (con.State == ConnectionState.Closed)

                {
                    con.Open();
                }

                Label flagID = (Label)e.Row.FindControl("ID");
                

                SqlCommand cmd = new SqlCommand("COMMAND ", con);

                cmd.CommandType = CommandType.Text;
                SqlDataAdapter da = new SqlDataAdapter(cmd);
                DataTable dt = new DataTable();
                da.Fill(dt);

                if (dt.Rows.Count >= 1)
                {

                    System.Web.UI.HtmlControls.HtmlIframe Iframe = (System.Web.UI.HtmlControls.HtmlIframe)e.Row.FindControl("IFRAMEID");

                    Iframe .Attributes["src"] = "fileViewer.aspx?Location=" + dt.Rows[0]["FileLocation"].ToString();
                }
                }
 }

然后在 FileViewer.ASPX 中,我将一个 IFrame 放在可以查看 PDF 的位置 我从附加到 URL

的查询字符串中提取了 SRC
 <iframe width="910px" height="1100px" scrolling="no" frameborder="0" id="iframe"></iframe>

并在 FileViewer 中。ASPX.CS 我放置了以下代码来填充这个新 IFrame 的 SRC。我 运行 这在页面加载时。

 void FileLoader()
    {
        Response.ContentType = "application/pdf";
        Response.AppendHeader("Content-disposition", "inline; filename=" + "PDFFile");
        string test = Request.QueryString["Location"];
        Response.TransmitFile(Request.QueryString["Location"]);
    }