【发布时间】:2013-01-04 05:37:15
【问题描述】:
我正在寻找一种仅允许特定用户访问某些 Excel 文件的方法。
这是场景:
我有一个 ASP.Net 4 应用程序,它是表单身份验证。我希望能够让许多用户访问不断增长的 Excel 文件集。每个用户都可以访问其中一组。
我可以很容易地安排一个导航页面,它只显示允许用户查看的 Excel 文件的超链接。但是,通过猜测 URL,也可以检索其他人的文件。
我尝试了以下场景: 为所有 Excel 文件设置一个基本文件夹,其中每个用户都有一个文件夹。在每个文件夹中,都会放置一个 web.config 文件。在主文件夹中,它包含以下内容:
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<deny users="*" />
</authorization>
</system.web>
</configuration>
每个子文件夹:
<?xml version="1.0"?>
<configuration>
<system.web>
<authorization>
<allow users="<username>" />
</authorization>
</system.web>
</configuration>
这适用于文件夹中的任何 .aspx 文件,但不适用于其他类型的资源,例如我的 Excel 文件。始终允许访问这些内容。我认为这是因为这些文件不是由 ASP.Net 工作进程处理的。
什么是只安排正确用户访问的好方法? 我正在考虑将 Excel 文件存储在 ASP.Net 应用程序的虚拟目录之外,并编写一些 ServeExcel.aspx 页面,该页面将使用响应流输出 Excel 文件。 有没有更好的方法来做到这一点?
补充,回应兄弟们的评论
我阅读了“演练:创建具有会员资格和用户登录的网站”并创建了一个测试站点。我没有从一个空的项目模板开始,而是从一个 ASP.Net Web 应用程序开始,而不是遵循所有步骤,并赶上了步骤“创建仅限成员的页面”中的演练。我跟进并包括步骤“添加新用户” '。我创建了两个用户,用户“member”,授予对文件夹 Membership 的访问权限,另一个用户“visitor”,拒绝访问此文件夹。除了教程中的步骤之外,我还添加了访问规则“拒绝用户”。
在运行 Web 应用程序时,成员页面 ~\MemberPages\Members.aspx 对 'member' 可见,而对 'visitor' 不可见。
之后,我在 MemberPages 文件夹中放置了一个文件 test.xls。令我惊讶的是,“访问者”(和匿名用户)也拒绝访问此文件!
2013 年 1 月 3 日添加的注释: 上述保护 Excel 文件的真正原因是我使用了内部的 Visual Studio 开发服务器。在服务器上,将使用 IIS,默认情况下 IIS 本身将提供 Excel 文件。我尝试通过修改 ISAPI 过滤器配置来修改 IIS 6.0 和 7.5 的配置,但最后这似乎对错误配置很敏感,所以我应用了 Joe 建议的解决方案。
这与我使用自己的 Web 应用程序的经验有很大不同,我发现项目之间存在显着差异。
我的项目不使用 ASP.Net Membership,而是使用自定义用户表。此外,自定义代码存在于 global.asax.vb 文件中:
Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As EventArgs)
If (Not (HttpContext.Current.User Is Nothing)) Then
Dim objLogin As New Person(ConfigurationManager.AppSettings("DBConnection"))
objLogin.AuthenticateUser(HttpContext.Current.User.Identity.Name)
Dim strRoles(10) As String
strRoles(0) = "user"
Dim objPrincipal As New System.Security.Principal.GenericPrincipal(objLogin, strRoles)
Context.User = objPrincipal
System.Threading.Thread.CurrentPrincipal = objPrincipal
End If
End Sub
注意:Person 类实现了 System.Security.Principal.IIdentity 接口。我不确定是否在测试项目中执行了类似的代码,但至少在 Global.asax.cs 或 Login.aspx.cs 文件中没有类似的代码。
我将调试器附加到我的项目中,发现 Application_AuthenticateRequest 对 aspx 文件的每个请求都执行,并且每次 HttpContext.Current.User 什么都没有。在请求 Excel 文件期间,不会执行此代码,我认为这就是为什么在没有 web.config 授权设置施加的任何限制的情况下提供文件的原因。
我找到了另一个帖子:Object persistence (between post-backs) in ASP.NET 并将深入研究它,看看它可以帮助我。
不过,由于我正在编写代码,为许多项目使用的一种框架 ASP.Net 应用程序添加一些自定义功能,我认为更改 global.asax 文件将超出可接受的修改范围。因此,我仍在考虑使用 ServeExcel.aspx/ashx 选项。
【问题讨论】:
-
您好,您是否保护了用户文件夹? msdn.microsoft.com/en-us/library/879kf95c(v=vs.100).aspx
标签: asp.net asp.net-authorization