【问题标题】:Securing a web folder with out membership roles defined保护未定义成员角色的 Web 文件夹
【发布时间】:2014-04-04 20:06:57
【问题描述】:

我们的网站托管在共享服务器上。我们有一个独立于任何成员角色的登录模块。我们没有使用这个功能。我们的登录数据库表只有电子邮件 id 和 pwd 字段。 我们的文件夹之一(常规)包含敏感文件:pdf; .jpg; doc 文件等。我们不希望未经授权的用户以及任何搜索引擎(如 google、yahoo 等)访问此文件夹。 我们在网络配置中添加了以下几行

<location path="General" allowOverride="true">
<system.web>
  <authorization>
    <allow roles="Administrators" />
    <deny users="*" />
  </authorization>
</system.web>
   </location>

Web 配置中的此更改已保护文件夹,因为访问该文件夹会导致权限被拒绝消息等。但是,现在我们希望我们的登录用户能够访问该文件夹。我们尝试为登录用户添加以下行: Roles.CreateRole("管理员"); 但是,这会导致错误;并且似乎 asp.net 正在尝试创建会员表并且无法创建。 是否可以通过完全忽略 Membership 部分来强制为用户分配角色?

我们没有使用 sqlaspent 表,也没有使用它的计划。 我们也没有使用 ASP.NET Membership 框架。

重新构建的原始问题:(从 web 配置中删除了 allow roles="Administrators" 行)

<location path="General" allowOverride="true">
    <system.web>
      <authorization>
              <deny users="*" />
      </authorization>
    </system.web>
       </location>

Web 配置中的上述更改导致 General 文件夹中的所有文件的访问被拒绝。是否可以 (1) 在运行时修改 web 配置并更改拒绝用户以允许用户在 general/test.aspx 页面加载部分或 (2) 从 general/test.aspx 页面中的不同文件夹加载不同的 web 配置加载?

【问题讨论】:

  • 您能否发布错误消息,我会说您需要拒绝匿名用户,然后允许需要访问该文件夹的角色。
  • 数据库的存储位置没有区别。成员资格提供者将管理用户身份验证,而角色提供者将处理角色。加载后,他们将使用当前用户凭据,然后检查他们应从会员提供者那里获得的访问权限。 部分基本上充当 ACL。
  • 原帖中添加了错误信息。另外,就像我提到的那样,我们没有在应用程序的任何地方使用会员角色功能。谢谢
  • 它是服务器上的远程数据库吗?或者它是存储在被 ConnectionString 引用的 App_Data 目录中的 SQLExpress 数据库
  • 远程数据库托管在远程第三方主机上。我们在 App_data 文件夹中没有任何内容——在我们的本地或远程 Web 文件夹中也没有。

标签: c# asp.net security directory membership


【解决方案1】:

这听起来像是数据库连接问题。您的远程提供商允许远程连接到您的数据库?您可以使用 SQL Server Management Studio 连接到它吗?

某些共享主机提供商不允许远程访问 SQL Server。

【讨论】:

    【解决方案2】:

    您是否已将 sqlaspent 表安装到数据库中?

    如果不需要使用Aspnet SQl Server Registration Tool,请在数据库中创建正确的结构表(已存储了哪些角色)。

    创建一个会员用户,如管理员、Jojom、Angelina Jolie 或您喜欢使用它自己的属性的用户) 创建默认角色(客户、管理员等)

    将用户绑定到会员,然后你就可以使用授权规则了。

    您的方法仅对 aspnet 说,只有通过 Context.User.IsInRole("Administrator") 可见的管理员成员才能访问此页面....但是要成为管理员,您需要将其存储到数据库中或在自定义提供程序中......

    【讨论】:

    【解决方案3】:

    我不知道如何在不使用成员资格提供程序的情况下将角色分配给用户。我能想到的一件事是放弃 web 配置中的位置扇区,并开始使用 Global.asax Application_BeginRequest 方法监视对应用程序的每个请求,并检查请求是否针对受限文件夹以及用户是否登录(会话)。

    另一种方法是使用某种 httpHandler 来进行保存。

    编辑: 在您的登录表单中,一旦用户通过其用户名和密码进行身份验证,就会分配一个会话变量,指出该用户是 Administrator。

    void Login()
    {
        //check user+password
        //...
        if(UserIsAuthenticated)
        {
            Session["Administrator"] = true;
            //more stuff to do with authenticate user
        }
    }
    

    在您的 Global.asax 中:

    void Application_BeginRequest(object sender, EventArgs e)
    {
        if(Request.PhysicalPath.Contains("RestrictedFolderName")//you can do a more profound check here
        {
             if((bool)Session["Administrator"])
                 //all ok - do nothing
             else
                 //not authorized user trying to access folder- do redirect or somthing 
        }
    }
    

    【讨论】:

    • 谢谢。我的头脑在燃烧。考虑到我们没有使用会员框架,我们如何检查用户登录(会话)。
    • 谢谢伊萨克。我可以限制对文件夹的访问。但是,我仍在努力(现在 4 小时!)获取 Session["Administrator"] 的值。它不断抛出 System.NullReferenceException。我也试过 Application_AcquireRequestState ,到目前为止还没有运气。一旦我能够检查 Session["Administrator"] - 我想它会解决的。希望如果我拒绝访问全局 asax 中的文件夹,搜索引擎 google 、 yahoo 等会受到纪律处分,否则他们仍然会找到爬入受限文件夹的方法?
    • 你在哪里分配 Session["Administrator"]?在尝试解析它之前,您需要检查它是否为空。搜索引擎爬虫充当匿名用户的角色,因此他们无法访问需要将会话分配给经过身份验证的用户的文件夹。您始终可以使用 Robots.txt 文件限制爬虫的访问
    • 谢谢。我有一个 Session["Userlogged"] = ok 在用户登录时触发。在全局 asax 中我确实在检查:(1)如果 Session["Userlogged"] 为空,则阻止访问受限文件夹。(2 ) 如果 Session["Userlogged"] = ok 然后允许访问。问题是会话总是从全局 asax 返回 null 值。我尝试了 Application_AcquireRequestState 和其他东西,但这个空引用错误消息突出。
    猜你喜欢
    • 1970-01-01
    • 2015-04-07
    • 2015-07-29
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 2018-10-06
    • 2012-02-20
    相关资源
    最近更新 更多