本文英文原版及代碼下載:
http://aspnet.4guysfromrolla.com/articles/121405-1.aspx#postadlink
考察Membership, Roles, 和Profile - Part 2
導言:
在Part 1我們已經提到Membership class類包含很多方法可以用來創建、刪除、修改、檢索、驗證用戶.由于每個開發者的需求不同,Membership class類被設計為使用provider模式。這就意味著membership framework在實際的執行過程中可以進行用戶定制.ASP.NET包含有SqlMembershipProvider和ActiveDirectoryMembershipProvider,如果有必要的話,你可以構建自己的provider.
很多網站需要將用戶劃分為不同的角色.對于處于某種角色的用戶,要指定其可以訪問哪些頁面、可以看到頁面的哪些內容、頁面某些區域的內容對用戶是可編輯還是只讀.使用ASP.NET 2.0的roles service的話,對用戶進行角色劃分、基于角色的功能和驗證都比較簡單了.與membership service類似,我們可以創建、刪除role,對用戶分配或移除角色;哪些用戶屬于哪個角色.
在本文,我們將考察ASP.NET 2.0的role service.我們最開始將看如何在網站里建立并配置roles service,以及如何基于認證規則來使用roles. 此外,我們看如何編程來處理roles service,以及如何使用LoginView Web控件,根據用戶的角色顯示信息.
先前準備
為使你的website支持角色,你的網站首先要有用戶帳戶,這些帳戶要么
由SqlMembershipProvider存儲在數據庫里;要么存儲在其它的數據庫里.
而role只是一個概念,將role分給具體的用戶.
設置你的Website支持Role
和membership service一樣,roles service也是使用provider模式,只是ASP.NET 2.0有3個role providers:
1.SqlRoleProvider(默認的)—將role信息存儲在一個SQL Server數據庫里.如果你使用SqlMembershipProvider的話,也可以用它來處理roles.具體來說,roles service使用2個表:aspnet_Roles表用來為系統里的每一個role生成一條記錄;另一個是aspnet_UsersInRoles表,該表將aspnet_Users表與aspnet_Roles表里的roles聯系起來.
2.WindowsTokenRoleProvider—獲得Windows用戶的族群信息.如果你是由Windows authentication登錄的授權用戶,那么該provider允許你查看用戶所在組的情況
3.AuthorizationStoreRoleProvider—由授權管理策略提供role信息,比如Active Directory.
本文將只對SqlRoleProvider provider進行考察,為了使用該provider,我們必須創建相應的數據庫表.就像我們在Part 1探討的那樣,有2種方式:
1.通過ASP.NET SQL Server注冊工具(aspnet_regsql.exe)——該工具允許你將必需的數據庫表、視圖、存儲過程拷貝到指定的SQL Server 2000 或 SQL Server 2005數據庫.
2.通過ASP.NET Website管理工具——當將認證類型選為"From the internet"時,該工具自動的調用aspnet_regsql.exe工具,在App_Data文件夾里的ASPNETDB.mdf數據庫里創建相應的數據表.
假設你已經創建好了必需的數據庫表,要激活role service的話,打開ASP.NET Website管理工具,點擊“Security”標簽,再點擊"Enable roles"鏈接,如下所示:
在Web.config文件里添加如下的代碼:
<roleManager enabled="true" />
如果你是使用的自己的數據庫來存儲SqlMembershipProvider 和 SqlRoleProvider providers的數據,你需要在<roleManager>元素里指定
一個provider,像下面這樣:
<configuration>
<connectionStrings>
<add name="MyDB" connectionString="..." />
</connectionStrings>
<system.web>
... authentication & authorization settings ...
<roleManager enabled="true"
defaultProvider="CustomizedRoleProvider">
<providers>
<add name="CustomizedRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="MyDB" />
</providers>
</roleManager>
</system.web>
</configuration>
其中,<connectionString>設置為myDB,其指定的連接字符串連接的數據庫里存儲的是與membership 和 role有關的數據庫表.(我們也可以在<roleManager> 和 <providers>元素里添加額外的特性,我們將在后面的文章探討)
管理Roles
role service提供了一個Roles class類,該類包含的方法可用于創建和刪除角色,以及從角色里添加或移除用戶.當你希望以編程的方式來完成這些事情的時候,這是比較有用的.不過我們通常以手工的形式來進行操作.我們可以用ASP.NET Website管理工具來完成,一旦一個角色被激活后,"Enable roles"鏈接就會變成這2個鏈接:"Disable roles"和"Create or Manage roles"。點擊后一個鏈接的話,在接下來的界面里你可以添加新角色或管理、刪除現有的角色.
圖2
點擊Manage鏈接的話,你將看到某個角色下的一系列用戶.類似的,退回到Security標簽,選"Manage users"的話,你也可以看到一個用戶所屬的一系列角色.
基于Role的認證
在ASP.NET 1.x版本里,利用Web.config文件里的<authorization>元素,我們可以對基于URL的認證(URL-based authorization),進行user和role級的限制.具體來說,一個<authorization>元素包含多個<allow> 和 <deny>元素,以指定一個文件夾或URL的認證角色.默認情況下anyone可以訪問一個URL,因此如果你要進行限制的話,你應該將<allow> 和 <deny> 元素合理的組合起來.
在2.0版本里,我們可以通過ASP.NET Website管理工具任意的進行設置.(當然,如果你愿意的話,也可以手工在Web.config文件添加<authorization>元素)。在管理工具的Security標簽,點"Create access rules"鏈接. 這樣在接下來的界面里你可以將authorization設置為users, user classes(*代表所有的users,?代表匿名users)或者roles(如果系統里有的話).選一個文件夾應用rules,指定user, user class,或 role,然后選擇訪問權限(Allow 或 Deny)
圖3
處理Roles Class類
通過Role class類可以編程的方式以多種方法訪問role service,比如:
.CreateRole(roleName):向系統添加新的角色
.DeleteRole(roleName):從系統刪除角色
.AddUserToRole(userName, roleName):向特定角色添加特定的用戶
.IsUserInRole(roleName) / IsUserInRole(userName, roleName):返回true 或 false.判斷當前用戶是否是某個特定角色的一員.
.GetAllRoles():返回有關系統所有的角色的字符串數組
.GetRolesForUser() / GetRolesForUser(userName):返回一個字符串數組,要么是當前用戶所屬的所有角色,要么是某個指定用戶所屬的所有角色.
這些方法可以用來在頁面展示系統里所有的角色,或某個用戶所屬的所有角色,或判斷某個用戶是否屬于某個角色.本文結尾部分的示例有2個頁面來演示如何使用Roles lass類:一個是UserList.aspx頁面,它列出了系統的所有用戶以及用戶所屬的角色。另一個是RoleList.aspx頁面, 它列出了系統所有的角色以及每個角色所屬的用戶.
在LoginView控件里使用基于角色的代碼
在前面我們總覽了ASP.NET 2.0里的security Web控件.其中一個是LoginView控件,它有2個模板:AnonymousTemplate和LoggedInTemplate.
當一個匿名用戶登錄頁面時,該控件將顯示AnonymousTemplate模板里的內容;如果是注冊用戶登錄的話,將顯示LoggedInTemplate模板里的內容.
LoginView控件也可以包含基于角色的模板,比如向控件添加一個 <RoleGroups>元素,再在里面放一個<asp:RoleGroup Roles="comma-delimited list of roles">模板,如下:
<asp:LoginView ID="LoginView1" runat="server">
<AnonymousTemplate>
OMG, you are, like so not logged in!
</AnonymousTemplate>
<RoleGroups>
<asp:RoleGroup Roles="Developer">
<ContentTemplate>
Welcome back! You are a Developer, I can
tell by your svelte figure and impeccable
social skills!
</ContentTemplate>
</asp:RoleGroup>
<asp:RoleGroup Roles="Administrator">
<ContentTemplate>
We all bow down to our system adminstrators!
</ContentTemplate>
</asp:RoleGroup>
</RoleGroups>
<LoggedInTemplate>
You are logged in!! But, wait, you are not
a member of any roles.
</LoggedInTemplate>
</asp:LoginView>
當訪問者登錄頁面時,如果有對應其角色的模板,就顯示該模板里的內容.
如果你以Developer角色登錄的話,你就會看到Developer模板的內容,而不是LoggedInTemplate模板的內容.類似的,如果你屬于Developer 和 Administrator角色, 你將會看到看到模板列表里第一個吻合的模板(就本例而言,為Developer)
結語:
就像我們在本文看到的那樣,ASP.NET 2.0支持roles和membership services 。它們都使用provider model模式。都包含很多方法來執行相應的任務.都可以通過ASP.NET Website管理工具進行配置.
激活了roles功能后,我們一個通過編程或使用Website管理工具手工的創建角色或向角色賦值.ASP.NET允許基于角色的驗證規則.所以你可以對各種文件和文件夾設置訪問權限.最后,LoginView控件提供了基于角色的模板,那意味著可以根據角色的不同顯示不同的內容.
祝編程快樂!
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
