我正在攻读微软考试,并正在处理一些示例问题。我有这个问题:
“您正在开发一个配置为使用成员资格和角色提供程序的ASP.NET Web应用程序。
您需要允许所有用户执行HTTP GET,但必须仅允许名为Moderator的用户执行POST操作。您应该将哪个配置添加到web.config文件?“
<authorization>
<deny verbs="POST" users="*" />
<allow verbs="POST" users="Moderator" />
<allow verbs="GET" users="*" />
</authorization>
<authorization>
<allow verbs="GET" users="*" />
<allow verbs="POST" users="Moderator" />
<deny verbs="POST" users="*" />
</authorization>
还有另外两个答案,但它们显然是错误的,所以我没有在这里复制它们。
我可以在两组规则之间找到的唯一区别是规则的放置顺序。
正确答案是第二套规则。这里的规则首先允许对“主持人”进行POST访问,然后为其他人删除它。这对我来说似乎是违反直觉的 - 给一个人一个特权,然后从每个人那里删除这个特权,然而这个人仍然拥有这个特权。
如果有任何第一套规则更有意义 - 先拒绝所有人,然后有选择地授予个人访问权限。显然这是错的!
任何人都可以解释为什么会这样,所以我能更好地理解这一点吗?
答案 0 :(得分:4)
这只是先到先得的情况。 ASP.NET按顺序处理规则,直到它匹配匹配的规则,因此在第一个场景中,它会在deny
达到{{1>之前达到POST
的allow
规则}}
如果有任何第一套规则更有意义 - 先拒绝所有人,然后有选择地授予个人访问权。
这不是它的工作原理。每个请求按规则检查规则,因此,第一条规则基本上是说:
POST
个请求。POST
对主持人的请求。GET
次请求。所有的顺序。这里的问题是,当主持人发送POST
请求时,它将匹配第一条规则(就像所有人一样)并被拒绝。但是,第二种情况是:
GET
次请求。POST
对主持人的请求。POST
对所有人的请求。因此,当主持人发送Post
请求时,它将匹配第二条规则并允许请求继续。如果其他人发送POST
请求,他们将达到第3条规则并被拒绝。
答案 1 :(得分:1)
按顺序评估规则,并使用与当前“属性集”匹配的第一个规则(=请求类型,用户是否经过身份验证,用户角色等)。来自MSDN:
给定一组应用程序的合并规则,ASP.NET开始于 列表的头部和检查规则,直到找到第一个匹配。该 ASP.NET的默认配置包含 element,授权所有用户。 (默认情况下,应用此规则 如果没有其他授权规则匹配,则允许该请求。 如果找到匹配且匹配是拒绝元素,则请求为 返回401 HTTP状态代码。如果allow元素匹配, 该模块允许进一步处理请求。