2012-08-31 97 views
2

我正在学习微软考试,并正在处理一些示例问题。我有这样的疑问:Asp.Net授权规则优先

“你正在开发其配置为使用会员和角色提供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访问,然后将其移除给其他人。这对我来说似乎是违反直觉的 - 给一个人一个特权,然后从每个人中删除这个特权,然而这个特权在之后仍然有特权。

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

任何人都可以解释为什么这是这种情况,所以我可以更好地理解这一点?

回答

4

这只是先到先得的情况。 ASP.NET按顺序处理这些规则,直至遇到匹配的规则为止,因此在第一种情况下,它将在之前达到POSTdeny规则,它将达到allow

如果第一套规则更有意义 - 首先否认每个人,然后有选择地授予个人访问权限。

这并不完全如此。这些规则检查每个请求,因此,什么第一规则基本上说的是:

  1. 拒绝来自每个人都POST请求。
  2. 允许POST对版主的要求。
  3. 允许GET每个人的请求。

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

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

因此,当主持人发送Post请求时,它将匹配第2条规则并允许请求继续。如果其他人发送POST请求,他们将触发第三条规则并被拒绝。

+0

我明白了谢谢。这仅仅是先到先得的情况。 Asp.Net首先发现“允许版主”,因为它匹配,所以可以忽略其余部分。 –

+0

繁荣。这正是我需要的。 +1。 – dstepan

1

规则按顺序进行评估,并使用匹配当前“属性集合”(=请求类型,用户是否通过验证,用户角色等)的第一条规则。从MSDN

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