阻止用户访问文件但允许管理员访问 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 + " #>";
}
}
关于如何做到这一点有什么想法吗?请帮忙
这是您必须遵循的步骤。
- 您将文件保存在
App_Data
目录下,任何用户都无法访问该目录。只有池可以访问那里的任何数据,因此您可以在后面的代码中保存和阅读,但不能通过任何 url 直接访问它
- 如果您的用户具有此角色,您可以创建一个 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"]);
}
我有一个网站,用户可以创建为他们存储为 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 + " #>";
}
}
关于如何做到这一点有什么想法吗?请帮忙
这是您必须遵循的步骤。
- 您将文件保存在
App_Data
目录下,任何用户都无法访问该目录。只有池可以访问那里的任何数据,因此您可以在后面的代码中保存和阅读,但不能通过任何 url 直接访问它
- 如果您的用户具有此角色,您可以创建一个 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"]);
}