【问题标题】:How does location authorization work when a user has multiple roles?当用户具有多个角色时,位置授权如何工作?
【发布时间】:2011-11-06 20:39:56
【问题描述】:

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

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

这是什么意思?

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

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

【问题讨论】:

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


    【解决方案1】:

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

    在测试了不同的角色配置后,角色的工作方式似乎与预期完全一致。如果用户是多个角色的成员,例如角色 A 和角色 C,如果您按照上面的方式进行配置,则允许“roleA,roleB”我的用户无论顺序如何都可以访问。删除配置中的角色A,我的用户不再具有访问权限。拿走roleB和readd roleA,我的用户又可以访问了,把它们都读了,用户可以访问。

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

    http://www.asp.net/security/tutorials/role-based-authorization-cs
    对基于角色的身份验证如何工作有很好的解释。没有关于多个角色的详细信息。

    另外,作为旁注,您可以通过编程方式检查角色,这维护起来有点麻烦,但是您可以随心所欲地处理授权,我在过去的项目中亲自这样做过,以限制用户访问不同的页面,它对我来说效果很好。

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

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

    进一步解释我是如何测试的:

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

    从这里是我的配置文件。这是默认 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>
    

    【讨论】:

    • 感谢您的回复。我没有使用角色组。 RoleGroups 看起来与 asp.net 控件相关联。我遇到的问题是,一旦我分配了逗号分隔的允许角色列表中不存在的其他角色,我的用户就会被重定向回登录页面。
    • @subt13 - “RoleGroups”只是本文所说的角色。它们与 asp.net 控件无关。
    • @Dylan - 如果我理解正确,你不会遇到和我一样的问题。我正在使用自定义角色提供程序和成员资格提供程序,但我不明白为什么会导致此问题。我什至不知道位置信息是否会影响我的自定义角色提供程序。
    • @subt13 - 更正我的默认 webforms 应用程序似乎处理多个角色,就好像用户属于它可以访问的允许角色的逗号分隔列表中的一个角色,无论顺序或多少角色在允许的列表中。从这里我想我不知道为什么事情会不一样......如果你真的想了解事情的本质但你需要,你可以反编译 system.web 并查看授权例程的工作原理像 Reflector 或 Boomerang 这样的反编译器。
    • 这有助于回答您的问题吗?或者您需要进一步的帮助吗?
    【解决方案2】:

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

    【讨论】:

    • 我认为这是一种解决方法,即使它并不能真正回答我的问题。
    猜你喜欢
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 2019-05-03
    • 2021-10-23
    相关资源
    最近更新 更多