top
Loading...
搶先試用ASP.NET2.0中的新型安全控件
一、 引言

與ASP.NET 2.0一同上市的有幾個新的安全控件-它們位于工具的Login選項卡中(見圖1)-這些控件大大簡化了Web開發人員的工作。通過使用這些新的安全控件,現在你可以執行例如用戶登錄、注冊、口令改變等的任務;而且,為此做出的努力僅是拖放相應的控件到你的Web表單上去。在本文中,我將向你展示怎樣使用這些新控件來實現用戶認證。

首先,讓我們探索一下LoginView、LoginStatus和LoginName三個控件的使用。首先,讓我們使用Visual Studio 2005 Beta 2構建一個Web工程。啟動Visual Studio IDE,然后從文件菜單中點擊"New Web Site"以創建一個新的Web工程,并命名工程為"C:SecurityControls"。

在Default.aspx Web表單上,拖放并加入一個LoginView控件。該LoginView控件是一個容器控件-用于根據用戶是否已登錄顯示不同的信息。

首先,我們用文本填充LoginView控件,如圖2所示。然后,把Login控件拖拽到LoginView控件上。在用戶還沒有被認證(匿名)之前,你剛輸入的文本將被顯示。該Login控件顯示一個鏈接以允許用戶被重定向到另一個頁面以登錄到應用程序。

在LoginView控件的"Smart Tasks"菜單上,把視圖改變為"LoggedInTemplate"(見圖3)。

隨后改變視圖,把在圖4中顯示的文本輸入到LoginView控件。一旦用戶被認證該文本即被顯示。然后,把LoginName控件拖放到LoginView控件之中。該LoginName控件將顯示用于登錄到應用程序的用戶名。


圖1.該圖顯示ASP.NET 2.0中新型安全控件。

圖2.圖顯示填充LoginView控件的過程。

圖3.你可以改變LoginView控件的顯示形式。

圖4.在用戶被認證后該文本顯示出來。

二、 使用Login控件

現在讓我們添加一新的Web表單到該工程(在解決方案資源管理器中右擊工程名稱并且選擇"Add New Item...")并且命名為Login.aspx。你的應用程序將使用這個表單來允許用戶登錄到該應用程序。

注意,在ASP.NET 2.0中,默認登錄頁面命名為Login.aspx(這是被默認加入到ASP.NET 2.0中的并可以通過查看machine.config.comments進行校驗)。

然而,如果你確實想為你的登錄頁面使用一不同的命名,你可以通過增加下列的幾行來修改Web.config文件。你可以改變認證方式-從缺省的Login.aspx改變為Authenticate.aspx:

<system.web>
<authentication mode="Forms">
<forms name=".ASPXAUTH"
loginUrl="Authenticate.aspx"
protection="Validation" timeout="999999" />
</authentication>
...


圖5.應用AutoFormat:這是一種應用格式到Login控件的方法。

圖6.增加一個模式:這是在應用彩色模式后的Login控件樣式。

把Login控件拖到Login.aspx上。你可以應用格式到Login控件以使它看起來更專業化。點擊Login控件的"Smart"標簽并且選擇"Auto Format..."鏈接(見圖5)。

選擇彩色模式之后,Login控件應該看上去如圖6所示。

默認情況下,ASP.NET 2.0使用Windows認證-如果你針對互聯網用戶那么這種方式不夠靈活。因此,你應該把認證方式從默認的Windows方式改變到表單認證方式。

添加一個Web.config文件到你的工程(在工程名字上單擊右鍵,在解決方案資源管理器中并選擇"Add New Item.... ",從可用的列表選項中選擇"Web Configuration File")。

在Web.config中,通過增加下列的幾行代碼,從Windows認證方式改變到表單認證方式。你使用表單認證,這樣你可以添加用戶到你的Web站點而不需要在Windows下創建新的用戶帳戶。

<system.web>
<authentication mode="Forms"/>
...

三、 把一新用戶添加到你的應用程序

在你繼續測試該應用程序之前,你需要為該應用程序創建一新用戶。你可以使用ASP.NET Web站點管理工具(WAT)來添加一新用戶到你的應用程序。為了激活WAT,選擇"Website",然后選擇"ASP.NET Configuration"(見圖7)。


圖7.Web站點管理:該圖顯示怎樣激活WAT

該WAT將被顯示在一新的網頁中。點擊"Security"鏈接跳轉到"Security"選項卡(見圖8)。


圖8.WAT:這里顯示出WAT的用戶接口。

這個"Security"選項卡允許你執行任務-例如創造并刪除用戶,以及為你的應用程序創建角色和存取規則。點擊"Create user"鏈接以添加一新用戶到你的應用程序(見圖9)。


圖9.WAT安全:選擇WAT中的"Security"選項卡能夠讓你管理安全特性

為該新建用戶帳戶提供必需的信息(見圖10)。注意,這里的口令必須是數字、字母和特殊的字符的結合。請確保至少為該口令提供7個字符。點擊"Create User"以添加一個新用戶。


圖10.增加用戶:該圖顯示出WAT安全屏幕,在此你可以添加新的用戶帳戶。

現在你已準備好測試該應用程序了。在解決方案資源管理器中選擇Default.aspx,然后按下F5鍵。點擊"Login"鏈接以登錄到應用程序中,然后輸入帳戶信息。當你成功地登錄到應用程序時,"Login"鏈接改變為"Logout"。圖11顯示出這些事件順序。


圖11.登錄:這三個屏幕顯示在用戶登錄到應用程序時的完整過程。

四、 創建新用戶

你需要設置CreateUserWizard控件的ContinueDestinationPageURL屬性,這樣在用戶點擊"Continue"按鈕時,它就能夠被重定向到另一個頁面,如一個歡迎頁面。

除了為用戶創建用戶帳戶外,你也可以允許用戶為自己創建新帳戶。這在有些場所下很有用-為了存取你的應用程序,例如在一個討論論壇,你允許用戶創建自由帳戶。

為了允許用戶創建新帳戶,可以使用CreateUserWizard控件。把CreateUserWizard控件拖放到Default.aspx并應用彩色模式。該控件看去應該如圖12所示。


圖12.CreateUserWizard控件:這個控件讓用戶創建他們自己的新用戶帳戶。

為測試應用程序,可以按下鍵F5。現在你自己可以創建一個新的用戶帳戶(見圖13)。提供必要的信息并點擊"Create User"。

五、 用戶信息的存儲位置

到目前為止,你已經看到了怎樣使用WAT和CreateUserWizard控件來創建用戶。你可能想知道這個信息被存儲在哪兒。如果你現在查看解決方案資源管理器并且刷新App_Data文件夾(右鍵點擊它并且選擇刷新文件夾),你就會看到一個名為ASPNETDB.MDF的項(見圖13)。


圖13.你將在解決方案資源管理器的此處找到ASPNETDB.MDF數據庫文件。

圖14.自動創建的用戶:該圖顯示出一個用戶創建一新的用戶帳戶。

在用戶創建成功后,你會看到如圖15所示的屏幕。


圖14.創建帳戶:在創建一新帳戶后,用戶會看到此屏幕。

這個ASPNETDB.MDF是一個SQL Server 2005速遞數據庫-默認地,ASP.NET 2.0使用之來存儲應用程序相關的數據例如用戶帳戶、配置,等等。為了分析這個數據庫,雙擊它則你會看到它的內容顯示在Database Explorer中(見圖16)。具體地說,aspnet_Membership和aspnet_Users表格將用來存儲你在前面創建的用戶帳戶信息。為了觀看表格的內容,只須右擊表格名字并選擇"Show Table Data"。


圖16.數據庫ASPNETDB.MDF:你可以在Database Explorer格子中探索ASPNETDB.MDF數據庫。

ASP.NET 2.0的一個很好的特點是不必要創建定制的數據庫來存儲你的用戶的信息。并且你甚至不需要擔心把用戶的口令進行散列化處理來安全地存儲它們。ASP.NET 2.0自動地為你做這件事情。

六、 會員供給者模型工作原理

ASP.NET 2.0使用一種新型的安全模型,稱為會員供給者模型。這個模型通過使開發者能夠選擇添加安全特性到他們的應用程序的方式來允許最大程度的靈活性和擴展性。

作為這個供給者模型擴展性的一個實例,請考慮一下新的安全(登錄)控件-你已在本文中看到過。這些控件、API以及構成該新模型的供給者顯示于下圖中。


圖會員供給者模型:該圖顯示了本文所討論的控件和會員供給者模型的各個層之間的關系。

在最頂層上是各種的Web服務器控件,例如Login、LoginStatus和LoginView控件。在該控件下面是API-它們執行要求其完成的任務。Membership類負責處理如添加和刪除用戶等的任務,而MembershipUser類負責管理用戶的信息如口令、口令問題,等等。這些會員API使用會員供給者來保存或進行持續性存儲。Visual Studio 2005與一個缺省的會員供給者一同發行-SQL Server 2005 Express Membership Provider。會員供給者的角色是充當會員API和數據存儲之間的橋梁,以便信息能夠被持續性存儲而不需要開發者編寫低層代碼來存取數據。

如果微軟提供的供給者不能滿足你的需要,你或者可以擴展它們或者編寫你自己的。例如,如果你想要用一個XML文檔而不是一個關系數據庫(例如SQLServer)來保存你的站點的會員信息,你可以編寫你自己的供給者來實現與XML文件的對話。

七、 恢復丟失的口令

恢復/清除丟失的口令是你-作為一個管理員需要執行的一項普通任務。PasswordRecovery控件允許用戶自己執行這項普通任務-通過自動地檢索口令然后用電子郵件把它發送給用戶。

僅在你以普通文本存儲口令而不是對口令的散列值進行存儲時,口令恢復才是重要的。然而,默認情況下,在machine.config文件中的設置指定所有的口令,在把它們存儲到成員數據庫之前,要被散列化處理。Machine.config默認情況下也不允許口令恢復。

為了在普通文本中存儲用戶口令,你可以在文件Web.config中添加下列入口:

...
<system.web>
<membership
defaultProvider="SqlProvider"
userIsOnlineTimeWindow="15">
<providers>
<clear />
<add
name="SqlProvider"
type="System.Web.Security.SqlMembershipProvider"
connectionStringName="LocalSqlServer"
applicationName="SecurityControls"
enablePasswordRetrieval="true"
enablePasswordReset="true"
requiresQuestionAndAnswer="true"
requiresUniqueEmail="true"
passwordFormat="Clear" />
</providers>
</membership>
...

具體地說,你現在清除了所有的會員供給者,然后添加一個新的SqlMembershipProvider。注意,為了允許口令檢索,你需要設置enablePasswordRetrieval(為真)和passwordFormat(清除之)屬性。

如果你設置了passwordFormat為散列化的,那么你必須把enablePasswordReset設置成假。

現在拖動PasswordRecovery控件到Default.aspx,然后應用彩色模式。該PasswordRecovery控件現在看起來象圖17。


圖17.PasswordRecovery控件。通過使用這個控件,用戶能夠恢復他們忘記的口令。

在PasswordRecovery控件的屬性窗口中,設置MailDefinition屬性下的"From"和"Subject"字段,如圖18所示。


圖18.PasswordRecovery控件屬性:如何在屬性瀏覽器中,配置你的PasswordRecovery控件

另外,你需要在你的機器上配置好SMTP服務,以便用PasswordRecovery控件來發送一電子郵件。為在你的機器上配置該SMTP服務,啟動WAT,選擇應用程序,然后選擇配置SMTP電子郵件設置。

為測試應用程序,按下F5鍵。你將被提示輸入你的用戶名,然后是你的安全問題。如果該安全問題的答案是正確的,那么口令將被以電子郵件形式發送給你;否則,在該頁面將顯示給你一錯誤消息,如圖19所示。


圖19.恢復一丟失的口令:用戶在恢復一個丟失的口令的過程中,會看到這個屏幕序列

為了安全原因,通過電子郵件發送口令給用戶不是一個好注意。因此,你確實需要小心地考慮使用這一選擇。

八、 改變口令

除了恢復失去的口令外,你還需要允許用戶改變他們的口令。在ASP.NET 2.0中,你可以通過使用ChangePassword控件來完成這項任務。
既然一個用戶只有在登錄后才能改變他們的口令,那么,你現在將要在你的應用程序(該程序僅為認證的用戶所存取)中創建一新文件夾。
你可以添加一新文件夾到你的應用程序-通過右擊解決方案資源管理器中的工程名,然后選擇"Add Folder",再選擇"Regular Folder"。命名文件夾為"Members"。現在,在該新文件夾上添加一新的表單(右擊"Members",然后選擇"Add New Item...")。命名該新建Web表單為ChangePassword.aspx(見圖20)。


圖20.這里顯示的是在工程上增加文件夾后的解決方案資源管理器。

為限制到成員文件夾的存取,添加下列<location>元素到Web.config。

...
</system.web>
<location path="Members">
<system.web>
<authorization>
<deny users="?" />
</authorization>
</system.web>
</location>
</configuration>

實質上,在成員文件夾中的頁面只能為認證過的用戶(所有的匿名用戶(?)將被否認存取)所存取。

拖放ChangePassword控件到ChangePassword.aspx之上并且應用彩色模式(見圖21)。


圖21.ChangePassword控件:通過使用這個控件使你容易地實現讓用戶改變他們的口令。

為了測試該應用程序,在解決方案資源管理器的成員文件夾中選擇ChangePassword.aspx文件并且按下F5鍵。你將首先被重定向到login.aspx頁面(為了認證)并且一旦被認證,ChangePassword.aspx頁面將被裝載。現在,你可以改變你的口令了(見圖22)。


圖22.改變口令:用戶在用ChangePassword控件改變口令時可能會看到這個屏幕序列。

編輯推薦:ASP.NET2.0+SQL Server2005構建多層應用
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗