asp.net|安全|控制項
一、 引言
與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控制項改變口令時可能會看到這個螢幕序列。