ASP.NET Forms Auth允许在拒绝所有其他文件时访问子目录中的特定文件

时间:2010-10-15 01:45:33

标签: asp.net web-config forms-authentication

我在允许特定角色访问子目录中的特定页面时遇到问题。

我的ASP.NET应用程序有一个目录,〜/ Forms / Administration具有有限的访问权限。有一个特定的文件,〜/ Forms / Administration / Default.aspx,我想给予1个额外的用户角色访问权限,以及Admin角色。

在〜/ Forms / Administration中,我有一个web.config文件,如下所示:

   <?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
        <authorization>
            <allow roles="Administrator, User" />
            <deny users="*"/>
        </authorization>
    </system.web>

    <location path="Forms/Administration/Default.aspx">
        <system.web>
            <authorization>
                <allow roles="Administrator, User, AdditionalUser" />
            </authorization>
        </system.web>
    </location>

</configuration>

Admin用户工作正常,但AdditionalUser总是失败。我尝试了很多东西 - 将位置列为

<location path="Forms/Administration/Default.aspx">

一样
<location path="~/Forms/Administration/Default.aspx">

第一个通用规则中的deny =“*”是先例吗?我试过改变

<deny users="*"/>

<deny users="?"/>

但最终会让ExtraUser访问所有内容。建议?

编辑:我尝试在通用拒绝规则之前放置特定位置允许,以便顺序重要。同样的问题。

更新:我在这里显然遗漏了一些内容:我删除了deny *配置,只留下了 特定位置部分。然后,我没有允许某些角色,而是将其设置为拒绝全部(*)。但是,当我登录时,它并没有否认我。我甚至将规则简化为不是文件特定的,但适用于整个目录,并且它不会拒绝任何东西。但是,原始的非位置特定规则确实有效,因此我知道正在读取此配置文件。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <location path="Forms/Administration">
        <system.web>
            <authorization>
                <deny users="*" />
            </authorization>
        </system.web>
    </location>
</configuration>

1 个答案:

答案 0 :(得分:20)

两件事:

  1. 该位置是相对于web.config文件的,因此如果您的web.config已经在/ Forms / Administration中,则应将其更正为:

    <location path="Default.aspx">
        <system.web>
            <authorization>
                <allow roles="Administrator, User, AdditionalUser" />
            </authorization>
        </system.web>
    </location>
    
  2. 为了澄清允许和拒绝的顺序,授权将根据它找到的第一个匹配来应用,因此顺序非常重要。例如:

    <deny users="*" />
    <allow users="Administrator" />
    
  3. 管理员将被拒绝,因为它与第一个拒绝条目匹配...即使您指定允许管理员用户在下一行。因此,只允许管理员,正确的语法是:

    <allow users="Administrator" />
    <deny users="*" />
    

    摘要

    如果我正在阅读您想要的内容,这可能是您想要的最终产品:

    <configuration>
      <system.web>
        <authorization>
            <allow roles="Administrator, User" />
            <deny users="*"/>
        </authorization>
      </system.web>
    
      <location path="Default.aspx">
        <system.web>
            <authorization>
                <allow roles="AdditionalUser" />
            </authorization>
        </system.web>
      </location>
    
    </configuration>