2012-08-31 146 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狀態碼一起返回。如果允許元素匹配,則模塊允許該請求被進一步處理。