我正在寻找一种仅允许特定用户访问某些 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 文件。有没有更好的方法来做到这一点?
另外,针对BrOSs的评论
我阅读了“演练:创建具有会员资格和用户登录的网站”并创建了一个测试站点。我没有从一个空的项目模板开始,而是从一个 ASP.Net Web 应用程序开始,而不是遵循所有步骤,并赶上了步骤“创建仅限成员的页面”中的演练。我跟进并包括步骤“添加新用户”。我创建了两个用户,用户“member”,授予对文件夹 Membership 的访问权限,另一个用户“visitor”,拒绝访问此文件夹。除了教程中的步骤之外,我还添加了访问规则“拒绝用户”。
运行 Web 应用程序时,成员页面 ~\MemberPages\Members.aspx 对“成员”可见,而对“访问者”不可见。
之后,我将文件test.xls放在 MemberPages 文件夹中。令我大吃一惊的是,“访问者”(和匿名用户)也拒绝访问此文件!
2013-01-03 添加的注释:上述保护 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 授权设置施加的任何限制的情况下提供文件的原因。
我发现了另一篇文章:ASP.NET 中的对象持久性(回发之间),并将深入研究它,看看它可以帮助我。
尽管如此,由于我正在编写代码,为许多项目使用的一种框架 ASP.Net 应用程序添加一些自定义功能,我认为更改 global.asax 文件将超出可接受的修改范围。因此,我仍在考虑使用 ServeExcel.aspx/ashx 选项。