【问题标题】:Can I put Excel files in my web application under control of ASP.Net authorization?我可以将 Excel 文件放在我的 Web 应用程序中,并受 ASP.Net 授权的控制吗?
【发布时间】: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 选项。

【问题讨论】:

标签: asp.net asp.net-authorization


【解决方案1】:

使用ServeExcel.aspx 页面(或ServeExcel.ashx 处理程序)来处理授权并提供Excel 文件是一种合理的方法。

【讨论】:

  • 谢谢。我喜欢 ashx 处理程序的想法,因为它更多的是服务而不是页面。您能否详细说明您的建议?欢迎提供动力。
  • 我写了一个提供文件的 ashx 处理程序。为了提供友好的 URL,例如:http:/mysite/reports/owner/2012/Q4/summary/,我使用了 ASP.Net 路由,如演练中所述:在 Web 窗体应用程序中使用 ASP.NET 路由 (@987654321 @)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多