【问题标题】:Asp.Net Authorization rule precedenceAsp.Net 授权规则优先级
【发布时间】:2012-08-31 17:11:17
【问题描述】:

我正在准备 Microsoft 考试,并且正在回答一些样题。我有这个问题:

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

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

谁能解释为什么会这样,以便我更好地理解这一点?

【问题讨论】:

    标签: asp.net authorization


    【解决方案1】:

    这只是先到先得的情况。 ASP.NET 按顺序处理规则,直到找到匹配的规则,因此在第一种情况下,它会在到达allow 之前到达deny 规则之前

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

    这不是它的工作原理。 根据请求检查规则,因此,第一条规则的基本含义是:

    1. 拒绝所有人的所有POST 请求。
    2. 允许 POST 请求主持人。
    3. 允许所有人的GET 请求。

    全部按此顺序。这里的问题是当主持人发送POST 请求时,它将匹配第一条规则(因为它适用于每个人)并被拒绝。但是,第二种情况是说:

    1. 允许所有人的GET 请求。
    2. 允许 POST 请求主持人。
    3. 拒绝所有人的POST 请求。

    所以当版主发送Post 请求时,它将匹配第二条规则并允许请求继续。如果其他人发送POST 请求,他们将违反第三条规则并被拒绝。

    【讨论】:

    • 我现在明白了,谢谢。这只是先到先得的情况。 Asp.Net 首先找到“Allow Moderator”,因为它匹配,所以它可以忽略其余部分。
    • 轰隆隆。这正是我所需要的。 +1。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多