本系列鏈接如下:
http://www.asp.net/learn/security/?lang=cs
Security Tutorials系列文章第一章:Security Basics and ASP.NET Support
本文英文原版:
http://www.asp.net/learn/security/tutorial-01-cs.aspx
導(dǎo)言:
論壇、電子商務(wù)網(wǎng)站等的一個共同點是什么呢?它們都提供用戶帳戶(user accounts).提供user accounts的站點都必須提供一系列的服務(wù),至少新用戶要能注冊、注冊的用戶要能登陸.網(wǎng)站根據(jù)在線的用戶作出這些抉擇:某些頁面或部分只能登陸用戶或一部分用戶才能訪問.某些頁面顯示的內(nèi)容要根據(jù)登陸的用戶而定,比如只對登陸用戶可見等.
本文是本系列的第一篇,在本系列我們將考察這些技術(shù):通過web form來甄別用戶,批準(zhǔn)對某個具體頁面或功能的訪問,以及在ASP.NET application里管理用戶帳戶.貫徹該系列我們將考察:
.甄別用戶
.通過ASP.NET的Membership framework來管理用戶帳戶
.創(chuàng)建、更新、刪除用戶帳戶
.對登陸用戶訪問某個頁面、目錄或相關(guān)功能進行限制.
.通過ASP.NET的Roles framework將用戶帳戶和角色關(guān)聯(lián)起來.
.管理用戶角色.
.對角色訪問某個頁面、目錄或相關(guān)功能進行限制.
.對ASP.NET的security Web controls進行定制以及擴展.
本系列通過很多的截屏來一步步地演示如何操作.每篇文章都分C#和Visual Basic 兩個版本供下載(這第一篇主要從較高的視角來看待security概念,因此沒有相關(guān)的代碼供下載).
本文我們將考察一下比較重要的security概念,以及在ASP.NET里可以使用那些東西執(zhí)行form驗證,授權(quán),用戶帳戶,角色等.
注意:
在任何跨技術(shù)的應(yīng)用程序里Security都是很重要一個方面.對多方面的知識要求較高.本系列不是指導(dǎo)如何開發(fā)安全的web應(yīng)用程序,相反僅僅專注于forms認(rèn)證,授權(quán),用戶帳戶和角色.有些與security相關(guān)的概念我們將在本系列探討,其它的就沒涉及了.
Authentication, Authorization, User Accounts, 以及Roles
Authentication, authorization, user accounts, 和roles在本系列里使用的很頻繁,因此我花點時間從web security的角度進行解釋說明.在一個客戶端——服務(wù)器模式里,比如英特網(wǎng),很多時候服務(wù)器要對發(fā)出請求的客戶端進行確認(rèn).Authentication就是探明客戶端身份的過程.客戶端成功的通過了服務(wù)器確認(rèn)的話,我們就可以說該客戶端通過鑒別了(authenticated).未經(jīng)確認(rèn)的客戶端可以叫做unauthenticated 或 anonymous(匿名).
Secure authentication systems至少要包括如下3方面之一: something you know, something you have,或something you are.絕大多數(shù)web應(yīng)用程序都需要依賴客戶端信息,比如,用戶密碼或個人身份號碼(PIN).這些信息用來對用戶進行確認(rèn)——比如他的username 和 password——這又涉及到credentials.本系列僅關(guān)注forms authentication,這種認(rèn)證模式需要用戶在一個web頁面表單(web page form)里提供他們的credentials.在以前我們都經(jīng)歷過這種類型的認(rèn)證.在任何的電子商務(wù)網(wǎng)站,當(dāng)你打算付賬時,我們都需要在一個頁面里將用戶名和密碼輸入textboxes里再登陸.
除了對客戶端進行確認(rèn)外,我們還需要對客戶端要訪問的資源和功能進行一些限制.Authorization就是這樣的一個過程:判斷某個用戶是否有訪問某些特定資源或功能的權(quán)限.
user account是對某個用戶的信息進行存儲.User accounts最少要包含可以唯一的識別用戶的信息,比如用戶的登錄名以及密碼.除了這些最基本的信息外,user accounts還可能包括:用戶的電子郵件,創(chuàng)建用戶的日期和時間,用戶最后一次登陸的時間,first name和last name,電話號碼,通訊地址等.使用forms authentication時,用戶帳戶信息一般是存儲在一個關(guān)系型數(shù)據(jù)庫里,比如Microsoft SQL Server.
支持用戶帳戶的Web應(yīng)用程序可以將用戶任意劃分成不同的角色.一個角色僅僅是一個應(yīng)用于某個用戶的標(biāo)簽,可以獲取授權(quán)規(guī)則以及頁面級的功能.比如,某個網(wǎng)站可能有一個“Administrator”角色,授權(quán)規(guī)則是,只有某個屬于“Administrator”角色的用戶才能訪問某些特定的頁面.此外,對那些所有人都可以訪問的頁面,如果是以Administrators角色進行訪問的話還可以顯示其它角色看不到的數(shù)據(jù)以及其它角色不能使用的功能.通過使用roles,我們就可以定義基于role,而不是基于user的規(guī)則.
在一個ASP.NET應(yīng)用程序里鑒別用戶
當(dāng)一個用戶在瀏覽器的地址欄輸入一個URL或點擊一個鏈接時,瀏覽器將向服務(wù)器發(fā)出一個a Hypertext Transfer Protocol (HTTP)請求,以請求指定的資源,它可能是一個ASP.NET page, 一個image,一個JavaScrips文件,或其它類型的資源. 服務(wù)器將返回指定的資源.這樣我們必須對請求做一些判定,包括是誰發(fā)出的請求,是否通過了授權(quán).
默認(rèn)情況下,瀏覽器發(fā)出HTTP請求時并沒有包含確認(rèn)信息.但如果瀏覽器包含authentication
信息的話,服務(wù)器就開始啟動authentication流程,它將對發(fā)出請求的客戶端進行確認(rèn),authentication流程采取的步驟取決于應(yīng)用程序使用的authentication類型.ASP.NET支持3種類型的authentication: Windows, Passport,以及forms. 本系列我們將關(guān)注forms authentication,不過我們先花點時間看看Windows authentication.
Windows Authentication認(rèn)證
Windows authentication流程使用如下的認(rèn)證技術(shù)之一:
.Basic authentication
.Digest authentication
.Windows Integrated Authentication
這3種技術(shù)的工作方式都一樣:當(dāng)未授權(quán)的、匿名的請求到達時,服務(wù)器將回送一個HTTP response,指出只有經(jīng)過授權(quán)才能繼續(xù)操作。瀏覽器然后顯示一個對話框,要求用戶輸入用戶名和密碼(見圖1),該信息然后經(jīng)由一個HTTP header發(fā)回服務(wù)器.
提供的信息將與服務(wù)器的Windows User Store進行確認(rèn).這就意味著在應(yīng)用程序里的每一個認(rèn)證用戶在組織機構(gòu)都必須有一個Windows帳戶. 這在企業(yè)內(nèi)部網(wǎng)是很常見的.實際上,在企業(yè)內(nèi)部網(wǎng)里使用Windows Integrated Authentication時,瀏覽器將自動的向服務(wù)器提供用于登陸網(wǎng)絡(luò)的credentials,因此不會出現(xiàn)如圖1所示的對話框.誠然,在企業(yè)內(nèi)部網(wǎng)里使用Windows authentication是很方便可取的,但在英特網(wǎng)應(yīng)用程序里這通常是難以實施的,因為你不可能向每一個用戶每次登陸網(wǎng)站時都創(chuàng)建一個Windows帳戶.
Forms Authentication認(rèn)證
相反,F(xiàn)orms authentication是用來處理英特網(wǎng)應(yīng)用程序的,記得我們說過forms authentication是將用戶的credentials輸入到一個web form來進行用戶確認(rèn)的.因此當(dāng)一個用戶試圖訪問一個未經(jīng)授權(quán)的資源時,將會自動的轉(zhuǎn)到一個登陸頁面,以便登陸.提交的credentials將與一個用戶定制存儲——通常是一個數(shù)據(jù)庫進行核對.
當(dāng)提交的credentials通過驗證后,將會為該用戶創(chuàng)建一個表單驗證票據(jù)(forms authentication ticket),該票據(jù)指出該用戶已經(jīng)通過驗證,且包含識別信息,比如用戶名.表單驗證票據(jù)(一般)是存儲為一個cookie,放在客戶端機器上.因此,當(dāng)再次訪問網(wǎng)站時,在HTTP請求里就包含了該表單驗證票據(jù),web應(yīng)用程序就可以識別出該用戶曾經(jīng)登陸過.
圖2圖解了authentication流程.注意,ASP.NET里的authentication 和 authorization模塊扮演的是2個彼此獨立的實體.forms authentication system對用戶進行確認(rèn)(或指出他們是匿名的),authorization system用來確定用戶是否有權(quán)訪問請求的資源.如果用戶未經(jīng)授權(quán)(比如圖2里,匿名訪問ProtectedPage.aspx頁面),那么authorization system將指出用戶被拒絕,導(dǎo)致forms authentication system自動的將用戶導(dǎo)航到登陸頁面.
我們將在接下來的二篇文章《An Overview of Forms Authentication》以及《Forms Authentication Configuration and Advanced Topics》里對forms authentication進行深入的探討,對ASP.NET的authentication的更多詳情,請參閱《ASP.NET Authentication》( http://msdn2.mirosoft.com/en-us/library/eeyk640h.aspx )
對Web Pages, Directories,以及Page Functionality的訪問進行限制
ASP.NET有2種途徑來判斷是否某個特定用戶有權(quán)訪問一個指定的文件或目錄:
.File authorization——由于ASP.NET pages和web services都是以服務(wù)器的文件系統(tǒng)里的文件為基礎(chǔ)執(zhí)行的.對這些文件的訪問可以通過Access Control Lists (ACLs)來指定. File authorization通常是在Windows authentication里使用的,因為ACLs是與Windows帳戶掛鉤的當(dāng)使用forms authentication時,所有的操作系統(tǒng)級以及文件系統(tǒng)級的請求都是以相同的Windows account來執(zhí)行的,而與登陸的用戶無關(guān).
.URL authorization——當(dāng)使用URL authorization時,頁面開發(fā)者在Web.config文件里指定authorization rules,這些規(guī)則指明了哪些用戶或角色被授權(quán)(或禁止)對特定的頁面或目錄進行訪問.
File authorization和URL authorization對某個特定的ASP.NET頁面或某個目錄里所有的頁面定義了訪問規(guī)則,利用這些技術(shù)我們可以讓ASP.NET拒絕某些用戶對某個特定頁面的請求,或只允許一部分用戶訪問.但還有這種情形,某個頁面允許所有的用戶訪問,但頁面所提供的功能卻因用戶的不同而不同.比如很多提供用戶帳戶的網(wǎng)站,有某些頁面,匿名用戶和登陸用戶看到的數(shù)據(jù)和內(nèi)容不一樣,匿名用戶看到的可能是一個登陸網(wǎng)站的鏈接,而登陸用戶看到的可能是“Welcome back, Username” ,同時還有一個供注銷的鏈接.還有一個例子:當(dāng)?shù)顷懸粋€拍賣網(wǎng)站時,你看到的信息是不一樣的,這取決于你是投標(biāo)人還是拍賣人.
像這樣的頁面級的調(diào)整可以通過顯式或編程的方式來實現(xiàn).為了使匿名用戶和驗證用戶看到的內(nèi)容不同,我們可以拖一個LoginView控件到頁面上,在AnonymousTemplate 和 LoggedInTemplate templates里分別輸入恰當(dāng)?shù)膬?nèi)容. 此外,你也可以編程來判斷當(dāng)前的請求是否進過了認(rèn)證,用戶是誰?屬于什么角色(如果有的話),然后你根據(jù)這些信息來決定來頁面上顯示或隱藏某些內(nèi)容.
本系列有3篇文章是關(guān)注authorization的.《User-Based Authorization》考察了如何限制特定的用戶帳戶對一個頁面或一個目錄里所有頁面的訪問.《Role-Based Authorization》考察如何提供角色級的authorization rule.《Displaying Content Based on the Currently Logged In User》將考察如何根據(jù)登陸頁面的用戶來修改某個頁面的內(nèi)容和功能.更多詳情請參閱《ASP.NET Authorization》
User Accounts and Roles
ASP.NET的forms authentication提供了一個基礎(chǔ)構(gòu)架(infrastructure)以便于用戶登錄站點,并在不同頁面之間導(dǎo)航是不會丟失其認(rèn)證狀態(tài)(authenticated state).URL authorization提供了一個框架來限制對ASP.NET應(yīng)用程序的某個文件或文件夾進行訪問.除此之外,太提供了一個方法來存儲帳戶信息或管理角色.
在ASP.NET 2.0之前,開發(fā)人員需要自己定義的用戶和角色存儲(user and role stores).他們也需要自己設(shè)計用戶接口、為那些與用戶帳戶相關(guān)的最基本的頁面——比如登錄頁面、創(chuàng)建新帳戶的頁面——編寫代碼以處理相關(guān)邏輯.沒有ASP.NET里內(nèi)置的用戶帳戶框架,開發(fā)人員需要自己決定如何處理哪些與用戶帳戶相關(guān)的問題,比如“如何存儲用戶密碼以及其它敏感的信息?”、“對密碼的長度以及安全性采取何種措施?”.
今天,歸功于Membership framework以及內(nèi)置的Login Web controls控件,在ASP.NET應(yīng)用程序里貫徹用戶帳戶變地簡單多了.Membership framework就是 System.Web.Security namespace命名空間里的一系列類,這些類提供了處理用戶帳戶相關(guān)問題的一些函數(shù)方法.Membership framework里的一個關(guān)鍵類是Membership class, 它包括的方法有:
.CreateUser——創(chuàng)建用戶
.DeleteUser——刪除用戶
.GetAllUsers——獲取所有用戶
.GetUser——獲取用戶
.UpdateUser——更新用戶
.ValidateUser——驗證用戶
Membership framework使用的是provider模式,它將Membership framework的API與具體的程序執(zhí)行分割開來.這就使開發(fā)人員可以使用一個常用的API,來滿足某個應(yīng)用程序具體的需求.簡而言之,Membership class定義了框架的最基本的功能(方法、屬性、事件等),但并沒有指定具體的實施細(xì)節(jié).相反,Membership class的方法調(diào)用配置好了的provider,由該provider實際執(zhí)行.比如,當(dāng)調(diào)用Membership class的CreateUser方法時,Membership class并不知道user store的具體細(xì)節(jié),它不清楚帳戶是存儲在一個數(shù)據(jù)庫,還是存儲在一個XML文件,又或
是其它的什么存儲方式.Membership class檢查應(yīng)用程序的配置以確定使用什么provider,由該provider在相應(yīng)的user store里創(chuàng)建新用戶帳戶.在圖3里用圖表進行相應(yīng)的闡述.
Microsoft在.NET Framework里提供了2種Membership provider classes:
.ActiveDirectoryMembershipProvider——在Active Directory以及Active Directory Application Mode (ADAM) servers里執(zhí)行Membership API.
.SqlMembershipProvider——在一個SQL Server數(shù)據(jù)庫里執(zhí)行Membership API.
本系列文章將只關(guān)注SqlMembershipProvider.
圖3
provider模式的好處在于,它可由微軟,第三方開人商、或某些獨立開發(fā)人員任意實施,并無縫的融入Membership framework.比如微軟針對Access數(shù)據(jù)庫發(fā)布了一個Membership provider.對該Membership providers的更多詳情請參閱《Provider Toolkit》,它包括了各個Membership providers,簡單的自定義providers,超過100頁的關(guān)于provider模式的文檔,以及內(nèi)置的Membership provider(也就是ActiveDirectoryMembershipProvider 和 SqlMembershipProvider)的完整源代碼.
ASP.NET 2.0同樣引入了Roles framework,與Membership framework類似,Roles framework也采用provider模式.其API包含在Roles class,在.NET Framework提供了3個provider classes:
.AuthorizationStoreRoleProvider——在一個authorization-manager policy store里管理角色信息,比如Active Directory或ADAM.
.RoleProvider——在一個SQL Server數(shù)據(jù)庫里貫徹roles
.WindowsTokenRoleProvider——將角色信息與登錄者的Windows group關(guān)聯(lián)起來,該方法典型的運用于Windows authentication.
本系列文章僅關(guān)注lRoleProvider.
由于provider模式包含的是相當(dāng)獨立的API(Membership以及Roles classes), 就使我們可以圍繞這些API構(gòu)建功能而不必?fù)?dān)心具體的實施細(xì)節(jié)——由頁面開發(fā)人員選定的provider來具體執(zhí)行.這些統(tǒng)一了的API使得微軟和第三方開發(fā)商可以創(chuàng)建接口面向Membership 和 Roles frameworks的Web控件.ASP.NET提供了很多的Login Web controls以執(zhí)行常見的用戶帳戶相關(guān)的用戶接口.比如,Login control揭示了用戶的credential,進行驗證,然后通過forms authentication使他們穿梭于網(wǎng)絡(luò).LoginView control使用模板為匿名用戶和驗證用戶提供不同的顯示界面,或根據(jù)用戶角色的不同顯示不同的界面.而CreateUserWizard control則為創(chuàng)建一個新用戶帳戶提供了一步步的創(chuàng)建界面.
各個Login controls都與Membership 和 Roles frameworks產(chǎn)生關(guān)聯(lián).絕大多數(shù)Login controls可以不用手寫一行代碼就可以運行.我們在后面的文章更詳細(xì)的闡述這些控件,包括如何對它們的功能進行擴展和定制.
結(jié)語:
所有提供用戶帳戶的web應(yīng)用程序面臨的問題都差不多:比如運行用戶登錄,在頁面之間導(dǎo)航時不丟失用戶信息,需要一個創(chuàng)建新帳戶的頁面;要使頁面開發(fā)人員指定對哪些用戶或角色顯示什么資源、數(shù)據(jù)、功能等.在對用戶認(rèn)證和授權(quán),以及管理用戶帳戶和角色在ASP.NET應(yīng)用程序里都是很容易實現(xiàn)的,這都要歸功于forms authentication, URL authorization,以及Membership and Roles frameworks.
在接下來的系列文章里我們將通過按部就班的方式構(gòu)建一個web應(yīng)用程序以對這些方面進行探討.在接下來的2篇文章里,我們將詳細(xì)的探討forms authentication,我們將實際的看到forms authentication工作流程,探討表單驗證票據(jù)(forms authentication ticket),探討security相關(guān)事項,以及如何來配置forms authentication system——運行訪問者登錄以及注銷.
祝編程快樂!
作者簡介:
Scott Mitchell,著有七本ASP/ASP.NET方面的書,是4GuysFromRolla.com的創(chuàng)始人,自1998年以來一直應(yīng)用 微軟Web技術(shù)。Scott是個獨立的技術(shù)咨詢顧問,培訓(xùn)師,作家,最近完成了將由Sams出版社出版的新作,24小時內(nèi)精通ASP.NET 2.0。他的聯(lián)系電郵為 mitchell@4guysfromrolla.com ,也可以通過他的博客 http://ScottOnWriting.NET 與他聯(lián)系。
Security Tutorials系列文章第一章:Security Basics and ASP.NET Support
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

