ASP.NET2.0导航功能之配置会员和角色
http://blog.csdn.net/deepbluekk/archive/2006/08/15/1067509.aspx
一、 簡介
在本文中,我們將探討ASP.net 2.0的會員、角色和配置問題。ASP.NET中的會員系統(tǒng)提供了一個可編程API用于創(chuàng)建和管理用戶賬戶,而其中的角色部分使開發(fā)者能夠定義一組角色并把用戶與角色相關(guān)聯(lián)。典型地,一個提供用戶賬戶的網(wǎng)站都具有只為某些用戶、認(rèn)證用戶或?qū)儆谔囟ń巧挠脩羲嫒〉膬?nèi)容部分。
例如,一個Web站點(diǎn)可能有一組頁面——它允許一個可信任用戶編輯該Web站點(diǎn)的內(nèi)容或管理已有用戶。不是簡單地試圖隱藏這個頁面并且希望沒有人偶然在瀏覽它時遇到麻煩,或硬編碼授權(quán)而僅僅允許單個用戶使用;一種更為強(qiáng)壯和安全的方式是定義一個管理員角色——然后賦給他一組選出來的信任用戶。最后,這些管理web頁面被進(jìn)一步配置以允許僅那些具有管理員角色的用戶可以進(jìn)行存取操作。同樣,該Web站點(diǎn)可能包含一組只有認(rèn)證用戶可以存取的頁面。
既然該站點(diǎn)的某些部分可能只能為某些用戶所存取,那么,這就使得我們在建立站點(diǎn)導(dǎo)航時有點(diǎn)進(jìn)退兩難。我們是否要包括那些只有授權(quán)用戶才能在Web站點(diǎn)的站點(diǎn)地圖中存取的頁面?如果我們這樣做了,那么所有的用戶將會在該站點(diǎn)的菜單或樹視圖中看到受限制的頁面。為什么不能向存取它們的用戶顯示指向這些頁面的鏈接呢?如果我們從站點(diǎn)地圖上刪除了這些受限制的頁面,那么那些來觀看這些頁面的授權(quán)用戶就無法容易地導(dǎo)航到它們,因?yàn)樗鼈儾皇钦军c(diǎn)地圖的一部分,并因此不會出現(xiàn)在該站點(diǎn)的樹視圖或菜單中!
值得慶幸的是,ASP.NET 2.0的站點(diǎn)導(dǎo)航提供了一種稱為安全性修剪的特性。當(dāng)用支持安全性修剪的功能獲得站點(diǎn)地圖信息時,只有那些當(dāng)前登錄的用戶具有訪問授權(quán)的站點(diǎn)地圖結(jié)點(diǎn)才是可用的。這意味著,站點(diǎn)的TreeView或Menu將僅包含為當(dāng)前登錄用戶可存取的那些部分。要想了解怎樣配置站點(diǎn)導(dǎo)航以支持安全性修剪,請接著往下讀!
二、 配置ASP.NET 2.0的會員和(可選)角色
既然站點(diǎn)導(dǎo)航安全性修剪把站點(diǎn)地圖數(shù)據(jù)基于訪問頁面的用戶和為站點(diǎn)地圖中的頁面定義的授權(quán)設(shè)置,那么在我們可以分析安全性修剪之前,你必須首先配置你的Web站點(diǎn)以使用ASP.NET 2.0的會員服務(wù)功能。(你也可以配置該站點(diǎn)來使用角色,并使用基于角色的授權(quán)優(yōu)點(diǎn),但是這對于展示安全性修剪概念并不作要求。)至于詳細(xì)討論怎樣配置一站點(diǎn)以使用會員和角色已經(jīng)超出了本文的范圍。
如果你不想在一個新的Web站點(diǎn)上花費(fèi)時間來安裝會員和角色特性的話,你可以使用它。具體地說,在本文后面可下載的Web站點(diǎn)中包含兩個角色——管理員(Administrator)和測試員(Tester),并有四個用戶:
·Superman,其角色為管理員和測試者
·Admin,其角色為管理員
·Mr.Tester,其角色為測試者
·Average User,沒有任何角色
而且,我在該工程中有三個文件夾:Admin,Tester和AuthUsersOnly。前兩個文件夾已經(jīng)被配置僅允許具有管理員和測試者角色的用戶存取。AuthUsersOnly文件夾被限制僅用于認(rèn)證的用戶。
三、 配置站點(diǎn)導(dǎo)航以使用安全性修剪
默認(rèn)地,站點(diǎn)導(dǎo)航并不使用安全性修剪。不管什么用戶正在訪問站點(diǎn),并且不管定義什么樣的授權(quán)規(guī)則,當(dāng)每個用戶通過一TreeView或菜單Web控件來觀看站點(diǎn)地圖數(shù)據(jù)時,他都被可以看到站點(diǎn)地圖中的所有部分。通過啟動安全性修剪,站點(diǎn)導(dǎo)航系統(tǒng)將自動地基于當(dāng)前登錄的用戶和為站點(diǎn)地圖中的<siteMapNode>元素所參考的頁面的授權(quán)而限制顯示結(jié)果。
可以使用下列模式通過Web.config文件來配置站點(diǎn)導(dǎo)航設(shè)置:
| <siteMap defaultProvider="XMLSiteMapProvider" enabled="true"> <providers> <add name="XMLSiteMapProvider" description="Default SiteMap provider." type="System.Web.XmlSiteMapProvider" siteMapFile="siteMapFileName" securityTrimmingEnabled="true" /> </providers> </siteMap> |
回想一下在本系列第一部分中的討論——站點(diǎn)導(dǎo)航系統(tǒng)使用了提供者模型。這個模型提供給開發(fā)者一些良好定義的公共API,但是允許(如果需要的話)定制內(nèi)部實(shí)現(xiàn)細(xì)節(jié)。缺省地,站點(diǎn)導(dǎo)航特點(diǎn)使用XmlSiteMapProvider-它從XML格式化的站點(diǎn)地圖文件Web.sitemap中獲得站點(diǎn)地圖信息。你可以通過Web.config文件來改變所使用的提供者,或修改針對缺省提供者的缺省設(shè)置。
為了定制缺省提供者的設(shè)置,只要簡單地添加一新的提供者-它使用與缺省提供者(System.Web.XmlSiteMapProvider)相同的類型來定制所需要的設(shè)置。上面顯示的代碼片段展示了定制兩個XmlSiteMapProvider的設(shè)置:
·siteMapFile設(shè)置指定由提供者所使用的站點(diǎn)地圖文件的文件名;缺省地,這個值是Web.sitemap。你如果喜歡,可以在此定制文件名。但是,我鼓勵你確保站點(diǎn)地圖文件名以.sitemap擴(kuò)展名結(jié)尾,因?yàn)槿笔〉剡@個擴(kuò)展名被ASP.net引擎保護(hù),從而阻止web訪問者觀看站點(diǎn)地圖文件。
·securityTrimmingEnabled設(shè)置顯示是否使用安全性修剪。為了使用安全性修剪,可以把它設(shè)置為true,如上面所示。
就是這些!僅需作此改變,站點(diǎn)導(dǎo)航系統(tǒng)就會根據(jù)當(dāng)前登錄的用戶和為在<siteMapNode>元素中的URL定義的授權(quán)設(shè)置非常聰明地返回正確的部分。下列屏幕快照顯示了當(dāng)分別在匿名訪問者(還沒有登錄的)、普通用戶以及Admin用戶訪問時的TreeView的顯示情況。該匿名訪問者僅能看到兩個鏈接-Home和 My Blog。普通用戶能看到另外的一個鏈接-Auth Users,而匿名訪問者是看不到它的,因?yàn)檫@個結(jié)點(diǎn)的URL(~/AuthUsers/Default.aspx)被配置為僅允許認(rèn)證用戶觀看。Admin用戶還能看到另外其它鏈接,因?yàn)樗枪芾韱T角色并且為Admin站點(diǎn)地圖結(jié)點(diǎn)(~/Admin/Default.aspx)所指向的URL被配置僅允許由管理員存取。
| 當(dāng)由匿名訪問者訪問時的TreeView |
| 為普通用戶訪問時的TreeView |
| 為Admin訪問時的TreeView |
?
四、 用角色屬性阻止安全性修剪
可能有一些時候-你想要顯式地通知安全性修剪不要為一個特別的角色或一組角色修剪一個站點(diǎn)地圖部分。例如,如果你的站點(diǎn)地圖包含一個到外部資源的鏈接,那么該站點(diǎn)導(dǎo)航系統(tǒng)不可能針對這個遠(yuǎn)程資源確定授權(quán)規(guī)則。因此,它為所有的用戶修剪該結(jié)點(diǎn)。也就是說,如果你啟動了安全性修剪功能并且在用一外部鏈接(如<siteMapNode url="http://www.scottonwriting.net/sowBlog/" title="My Blog"/>)使用一個站點(diǎn)地圖,那么,沒有用戶會在TreeView或Menu控件中看到這些。然而,你可能想要讓該站點(diǎn)導(dǎo)航系統(tǒng)為那些具有Administrator和Tester角色的用戶顯示這一結(jié)點(diǎn)。(或不考慮任何用戶的角色。)
同樣,即使他們沒有被授權(quán)存取該資源,你也可能想向這些用戶顯示一個局部站點(diǎn)地圖結(jié)點(diǎn)。例如,一訪問該站點(diǎn)卻還沒有登錄的用戶肯定不會看到在TreeView中的Admin鏈接。然而,我們?nèi)钥赡芟腼@示之。點(diǎn)擊它將會使用戶被導(dǎo)航到~/Admin/Default.ASPx頁面,此時,系統(tǒng)將看到他們沒有被認(rèn)證。這將把他們引導(dǎo)到登錄頁面。在登錄后,他們將被自動地引導(dǎo)回Admin頁面。如果他們不是管理員角色,他們將被送回到登錄頁面,否則他們將被同意存取Admin部分。
為了不修剪針對一個特定的站點(diǎn)地圖結(jié)點(diǎn)的特別角色,可以使用在相應(yīng)的<siteMapNode>元素中的角色屬性。(注意:這一設(shè)置不會應(yīng)用到descendent<siteMapNode>元素;也就是說,對那些顯式地指定另外的應(yīng)該看到該結(jié)點(diǎn)的角色,你必須顯式地在每一個<siteMapNode>元素上設(shè)置這一屬性)。此角色屬性能包含一個角色名,一個用逗號間隔列表的角色名字,或一個星號(*)來表示所有的用戶。包含在本文末尾的下載文件中的下列站點(diǎn)地圖文件顯示出怎樣使用角色屬性來使得所有的用戶擁有一個外部的站點(diǎn)地圖結(jié)點(diǎn)參考。(可以聯(lián)想到,當(dāng)啟動安全性修剪功能時,如果在此忽略角色屬性,這將導(dǎo)致不向任何用戶顯示這個站點(diǎn)地圖結(jié)點(diǎn)。)>
| <siteMap XMLns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" > <siteMapNode url="~/Default.aspx" title="Home"> <siteMapNode url="~/About.aspx" title="About" /> <siteMapNode url="~/Admin/Default.aspx" title="Admins" /> <siteMapNode url="~/Tester/Default.aspx" title="Tester" /> <siteMapNode url="~/AuthUsers/Default.aspx" title="Auth Users Only" /> <!-- For links to outside resources, need to explicitly define what roles should be shown this section --> <siteMapNode url="http://www.scottonwriting.net/sowBlog/" title="My Blog" roles="*" /> </siteMapNode> </siteMap> |
該角色屬性還可以用于在安全性修剪功能性上增加一些性能改進(jìn)。在啟動了安全性修剪功能后,站點(diǎn)導(dǎo)航提供者為所有的定義在站點(diǎn)地圖中的結(jié)點(diǎn)自動地檢查授權(quán)規(guī)則。對于那些你想要向所有的用戶顯示的結(jié)點(diǎn),通過添加roles="*",你可以繞過這一檢查,如上例中所示。通過添加這個屬性,你會短路正常的授權(quán)檢查,從而改進(jìn)安全性修剪性能。
五、 結(jié)論
除了提供站點(diǎn)導(dǎo)航支持外,ASP.NET 2.0還使得構(gòu)建包括用戶帳戶支持和基于角色的授權(quán)的Web站點(diǎn)非常容易。隨之而來的并不令人感到驚奇-這兩個系統(tǒng)可以互操作并且提供一個站點(diǎn)地圖-其返回內(nèi)容是基于當(dāng)前登錄的用戶和定義在站點(diǎn)地圖中的URL的授權(quán)設(shè)置。配置站點(diǎn)導(dǎo)航以限制基于訪問用戶和授權(quán)設(shè)置的結(jié)果就象把一些代碼添加Web.config文件一樣地容易。
轉(zhuǎn)載于:https://www.cnblogs.com/yiki/archive/2007/01/22/626638.html
總結(jié)
以上是生活随笔為你收集整理的ASP.NET2.0导航功能之配置会员和角色的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 显示并查询纯真官方最新IP地址的免费代码
- 下一篇: ASP.NET2.0服务器控件之类型化样