我的 web.config 有这个授权规则:
<location path="Views/Administrator">
<system.web>
<authorization>
<allow roles="roleA, roleB" />
<deny users="*" />
</authorization>
</system.web>
</location>
这是什么意思?
当我测试登录过程时,角色A 中的用户或角色B 中的用户能够访问 View /管理员下的所有内容,但是当用户使用角色C 登录时,他们被拒绝访问。到目前为止,这是有道理的。乍一看,这意味着允许具有角色 A 或角色 B 的用户。 但是 当我将角色 roleA 和 roleC 分配给同一用户并尝试登录时,我被拒绝了。这意味着授权规则会查看用户所在的所有角色,如果用户没有
<allow />
标签中定义的所有角色,则拒绝用户访问。所以:“当用户有多个角色时,位置授权如何工作?”
最佳答案
好的,我刚刚创建了一个使用默认角色管理器内容的新 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 。对基于角色的身份验证的工作原理有很好的解释。没有关于多个角色的重要信息。
另外作为旁注,您可以以编程方式检查角色,这维护起来有点麻烦,但是您可以以任何您喜欢的方式处理授权,我在过去的项目中亲自这样做以限制用户对不同页面的访问并且已经解决了对我来说很好。
http://www.4guysfromrolla.com/articles/082703-1.2.aspx
编辑 - 添加有关我的测试的信息。
进一步解释我如何测试:
我在 Web 管理工具中创建了一个基本用户和 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>
关于asp.net - 当用户具有多个角色时,位置授权如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8030221/