当用户具有多个角色时,位置授权如何工作?

时间:2011-11-06 20:39:56

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

我的web.config有这个授权规则:

  <location path="Views/Administrator">
    <system.web>
      <authorization>
        <allow roles="roleA, roleB" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>

这是什么意思?

当我测试登录过程时, roleA 中的用户或 roleB 中的用户能够访问Views / Administrator下的所有内容,但是当用户登录时使用 roleC ,他们将被拒绝访问。到目前为止这是有道理的。乍一看,这意味着允许具有 roleA roleB 的用户。 当我将角色 roleA roleC 分配给同一个用户并尝试登录时,我被拒绝了。这意味着授权规则会查看用户所在的所有角色,如果用户没有<allow />标记中定义的所有角色,则会拒绝用户访问。

所以:“当用户有多个角色时,位置授权如何工作?”

2 个答案:

答案 0 :(得分:3)

好的,我刚刚创建了一个使用默认角色管理器的新Web应用程序。我创建了三个角色:roleA,roleB,roleC。在我的应用程序中,我添加了您在上面使用的相同配置条目,但将路径更改为关于“About.aspx”页面的默认值。

在测试不同的角色配置之后,角色似乎完全按照预期工作。如果用户是多个角色的成员,例如roleA和roleC,如果您按照上面的方式设置配置,则允许“roleA,roleB”我的用户无论订单如何都可​​以访问。在配置中删除roleA,我的用户不再具有访问权限。带走roleB并读取roleA,我的用户再次访问,同时读取它们,用户有权访问。

编辑2 - 删除带有“RoleGroup”的图像,因为我相信它会增加混乱。

http://www.asp.net/security/tutorials/role-based-authorization-cs
对基于角色的auth如何工作有一个很好的解释。没有关于多个角色的好消息。

另外作为旁注,您可以检查programaticaly的角色,这有点繁琐,但您可以按照自己喜欢的方式处理授权,我在过去的项目中亲自完成此操作,以限制用户访问不同的页面对我来说效果很好。

http://www.4guysfromrolla.com/articles/082703-1.2.aspx

编辑 - 添加有关我测试的信息。

进一步解释我的测试方式:

我在网络管理工具中创建了一个基本用户和3个角色。创造了3个角色。并将roleA和roleC分配给我的用户。

Web Admin

从那里开始我的配置文件。哪个是带有上面添加设置的新项目的默认Web配置。

<?xml version="1.0"?>
<configuration>
  <connectionStrings>
    <add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\aspnetdb.mdf;User Instance=true"
     providerName="System.Data.SqlClient" />
</connectionStrings>
<system.web>
    <compilation debug="true" targetFramework="4.0" />

 <authentication mode="Forms">
   <forms loginUrl="~/Account/Login.aspx" timeout="2880" />
 </authentication>

<membership>
  <providers>
    <clear/>
    <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="ApplicationServices"
         enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10"
         applicationName="/" />
  </providers>
</membership>

<profile>
  <providers>
    <clear/>
    <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider" connectionStringName="ApplicationServices" applicationName="/"/>
  </providers>
</profile>

<roleManager enabled="true">
  <providers>
    <clear />
    <add connectionStringName="ApplicationServices" applicationName="/"
      name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
    <add applicationName="/" name="AspNetWindowsTokenRoleProvider"
      type="System.Web.Security.WindowsTokenRoleProvider" />
  </providers>
</roleManager>

</system.web>

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>


 <location path="About.aspx">
    <system.web>
        <authorization>
            <allow roles="roleA, roleB" />
            <deny users="*" />
        </authorization>
    </system.web>
 </location>

答案 1 :(得分:-1)

尝试以编程方式执行此操作,如前所述。 if(User.IsInRole(“RoleC”)) { ...等 }