Asp.Net授权规则优先级

时间:2012-08-31 08:50:19

标签: asp.net authorization

我正在攻读微软考试,并正在处理一些示例问题。我有这个问题:

“您正在开发一个配置为使用成员资格和角色提供程序的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访问,然后为其他人删除它。这对我来说似乎是违反直觉的 - 给一个人一个特权,然后从每个人那里删除这个特权,然而这个人仍然拥有这个特权。

如果有任何第一套规则更有意义 - 先拒绝所有人,然后有选择地授予个人访问权限。显然这是错的!

任何人都可以解释为什么会这样,所以我能更好地理解这一点吗?

2 个答案:

答案 0 :(得分:4)

这只是先到先得的情况。 ASP.NET按顺序处理规则,直到它匹配匹配的规则,因此在第一个场景中,它会在deny 达到{{1>之前达到POST allow规则}}

  

如果有任何第一套规则更有意义 - 先拒绝所有人,然后有选择地授予个人访问权。

这不是它的工作原理。每个请求按规则检查规则,因此,第一条规则基本上是说:

  1. 拒绝所有人发出POST个请求。
  2. 允许POST对主持人的请求。
  3. 允许每个人GET次请求。
  4. 所有的顺序。这里的问题是,当主持人发送POST请求时,它将匹配第一条规则(就像所有人一样)并被拒绝。但是,第二种情况是:

    1. 允许每个人GET次请求。
    2. 允许POST对主持人的请求。
    3. 拒绝POST对所有人的请求。
    4. 因此,当主持人发送Post请求时,它将匹配第二条规则并允许请求继续。如果其他人发送POST请求,他们将达到第3条规则并被拒绝。

答案 1 :(得分:1)

按顺序评估规则,并使用与当前“属性集”匹配的第一个规则(=请求类型,用户是否经过身份验证,用户角色等)。来自MSDN

  

给定一组应用程序的合并规则,ASP.NET开始于   列表的头部和检查规则,直到找到第一个匹配。该   ASP.NET的默认配置包含   element,授权所有用户。 (默认情况下,应用此规则   如果没有其他授权规则匹配,则允许该请求。   如果找到匹配且匹配是拒绝元素,则请求为   返回401 HTTP状态代码。如果allow元素匹配,   该模块允许进一步处理请求。