我正在努力理解:
之间的区别<authorization>
<allow users="*" />
<deny users="?" />
</authorization>
vs(更改顺序)
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
在评估规则时,ASP.NET会从顶部扫描列表 底部。一旦找到适用的规则,就会停止搜索。
因此,在第一个示例中:它将确定规则<allow users="*">
适用于当前请求,不评估第二行。
但我也读到了:
然而,撤消这两行的顺序拒绝匿名 用户(通过匹配第一个规则)和允许所有其他用户(通过 匹配第二条规则)。
问题:
为什么的规则“一旦找到适用的规则,就停止搜索”在第二个例子中不适用?
我原以为它会拒绝所有匿名用户并停止(不会进入<allow users="*" />
)。
答案 0 :(得分:1)
这里没有真正的矛盾所以这句话仍然是正确的
在评估规则时,ASP.NET会从上到下扫描列表。一旦找到适用的规则,它就会停止搜索。
但是,您需要了解*
和?
的含义。
来自MSDN
Identity Description * Refers to all identities ? Refers to the anonymous identity
这意味着*
匹配所有用户:匿名用户和经过身份验证的用户,但?
仅匹配匿名用户。
让我们走过两个配置:
<authorization>
<allow users="*" />
<deny users="?" />
</authorization>
“常规”用户加入 - &gt; users="*"
匹配 - &gt;允许访问,不检查第二条规则。
匿名用户进来了 - &gt; users="*"
匹配,因为它也匹配匿名用户 - &gt;允许访问,不检查第二条规则。
但在第二种情况下:
<authorization>
<deny users="?" />
<allow users="*" />
</authorization>
“常规”用户加入 - &gt; users="?"
不匹配,因为它只匹配匿名用户 - &gt;检查第二个角色:匹配的users="*"
- &gt;允许访问。
匿名用户进来了 - &gt; users="?"
匹配 - &gt;访问被拒绝,第二条规则未被检查。