上篇講到如何配置membership以及ASP.NET Forms身分識別驗證,本篇將對許可權控制部分,做一個詳細的解釋。
在所有的基本配置都完畢後,我們還需要配置哪些目錄允許被匿名訪問,哪些是需要使用者登入後允許訪問的頁面。
首先:我們在項目中建立一個admin檔案夾,在admin檔案夾中添加一個web.config檔案,然後在其中的<system.web>節點下面添加如下代碼:
<authorization>
<allow users="admin"/>
<deny users="*"/>
</authorization>
然後我們在admin目錄下再添加一個頁面,然後訪問該頁面,看一下效果。如果您按照我們上篇所說的內容全部正確配置了,那麼你會發現,頁面並沒有顯示出來,而是跳轉到了我們之前在<authentication>下<forms>節點的LoginUrl屬性所指向的頁面,要求登入!這不就是我們需要的效果嗎?
現在來解釋一下上面配置的含義:
<allow>節點:顧名思義就是允許訪問的意思,<allow users="admin"/>就是允許使用者名稱為"admin"的使用者訪問。
<deny>節點:就是禁止訪問。這裡用到了一個萬用字元“*”,萬用字元有兩個:*代表所有使用者,還有一個“?”代表所有匿名使用者。所以<deny users="*"/>就是不允許所有使用者訪問的意思啦,當然如果是:<deny users="?"/>那意思就是不允許所有匿名使用者存取。
需要說明的是:所有的配置都是按照從上到下的順序來匹配的,一但匹配成功,就不再向下匹配。舉個例子:
<authorization>
<allow users="admin"/>
<allow users="zhangsan"/>
<deny users="*"/>
</authorization>
ASP.NET首先檢測當前登入的使用者名稱=="admin"?如果等於則不繼續判斷,直接允許該使用者訪問。如果不等於則繼續判斷當前登入的使用者名稱=="zhangsan"等於,則允許訪問,不等於則接著向下,讀取到了<deny users="*"/>這個配置,拒絕所有使用者訪問,跳轉到LoginUrl指定的頁面要求重新登入。
可是如果這樣,只能實現目錄一級的許可權控制,如果要控制某個檔案的存取權限,又該如何做呢?難道非得把這個檔案放到一個檔案夾中,然後再添加web.config進行控制嗎?答案是否定的,對於單個檔案的存取控制,ASP.NET也有相應的配置:
<configuration>
<location path="a.aspx">
<system.web>
<authorization>
<deny users="?"/>
</authorization>
</system.web>
</location>
<system.web>
<authorization>
<allow users="admin"/>
<allow users="zhangsan"/>
<deny users="*"/>
</authorization>
</system.web>
</configuration>
看上面這個配置,我們可以在<system.web>節點之上(必須是上面)再增加一個<location>節點,通過path屬性指明location內的配置是單獨針對哪個檔案即可。具體內容我就不多說了,想必大家也都看得懂。不過需要注意的一點就是:location節點可以有多個。這意味著同一個目錄下的不同檔案可以有不同的存取權限。
好了,配置到這裡算是完成一多半了。還有一個問題就是:如果我們的使用者比較多,那麼需要在設定檔中把這些使用者全部羅列其中。並且以後添加了新使用者,還得繼續修改配置,太麻煩了!該怎麼辦呢?通用的做法就是引入角色的概念。給所有的使用者指派一個角色,比如:users,admin等。然後我們只需要控制這些角色的存取權限即可。以後添加了新使用者只需給這個新使用者指派角色,而不用去修改配置,實在是方便。其實,membership也提供了角色的概念,只需要簡單的配置一下就可以實現了。
要實現角色功能,非常簡單,我們還是去machine.config的<system.web>節點下面找到<roleManager>節點,然後整個節點複製過來到web.config中去,一般會有兩個<add>子結點,我們刪除一個,留下一個就可以了。全部內容如下:
<roleManager>
<providers>
<add name="AspNetSqlRoleProvider"
connectionStringName="LocalSqlServer"
applicationName="/"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
這個配置比較簡單,各項配置和前面配置都一樣,不再多說。稍微修改一下:
<roleManager enabled="true" defaultProvider="myAspNetSqlRoleProvider">
<providers>
<add name="myAspNetSqlRoleProvider"
connectionStringName="ConnectionString"
applicationName="TestMembership"
type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
注意:這個roleManager多了個屬性enable="true",這是因為角色管理預設情況下是關閉的,所以我們必須得設定為開啟才行。
好了,所有的配置到這裡算是全部結束了。欲知後事如何且聽下回分解:《ASP.NET身分識別驗證機制membership入門——編碼篇》。