一 引言
與ASPNET 一同上市的有幾個新的安全控件它們位於工具的Login選項卡中(見圖)這些控件大大簡化了Web開發人員的工作通過使用這些新的安全控件現在你可以執行例如用戶登錄注冊口令改變等的任務而且為此做出的努力僅是拖放相應的控件到你的Web表單上去在本文中我將向你展示怎樣使用這些新控件來實現用戶認證
首先讓我們探索一下LoginViewLoginStatus和LoginName三個控件的使用首先讓我們使用Visual Studio Beta 構建一個Web工程啟動Visual Studio IDE然後從文件菜單中點擊New Web Site以創建一個新的Web工程並命名工程為C:\SecurityControls
在Defaultaspx Web表單上拖放並加入一個LoginView控件該LoginView控件是一個容器控件用於根據用戶是否已登錄顯示不同的信息
首先我們用文本填充LoginView控件如圖所示然後把Login控件拖拽到LoginView控件上在用戶還沒有被認證(匿名)之前你剛輸入的文本將被顯示該Login控件顯示一個鏈接以允許用戶被重定向到另一個頁面以登錄到應用程序
在LoginView控件的Smart Tasks菜單上把視圖改變為LoggedInTemplate(見圖)
隨後改變視圖把在圖中顯示的文本輸入到LoginView控件一旦用戶被認證該文本即被顯示然後把LoginName控件拖放到LoginView控件之中該LoginName控件將顯示用於登錄到應用程序的用戶名
圖該圖顯示ASPNET 中新型安全控件
圖圖顯示填充LoginView控件的過程
圖你可以改變LoginView控件的顯示形式
圖在用戶被認證後該文本顯示出來
二 使用Login控件
現在讓我們添加一新的Web表單到該工程(在解決方案資源管理器中右擊工程名稱並且選擇Add New Item)並且命名為Loginaspx你的應用程序將使用這個表單來允許用戶登錄到該應用程序
注意在ASPNET 中默認登錄頁面命名為Loginaspx(這是被默認加入到ASPNET 中的並可以通過查看ments進行校驗)
然而如果你確實想為你的登錄頁面使用一不同的命名你可以通過增加下列的幾行來修改nfig文件你可以改變認證方式從缺省的Loginaspx改變為Authenticateaspx:
<systemweb>
<authentication mode=Forms>
<forms name=ASPXAUTH
loginUrl=Authenticateaspx
protection=Validation timeout= />
</authentication>
圖應用AutoFormat:這是一種應用格式到Login控件的方法
圖增加一個模式:這是在應用彩色模式後的Login控件樣式
把Login控件拖到Loginaspx上你可以應用格式到Login控件以使它看起來更專業化點擊Login控件的Smart標簽並且選擇Auto Format鏈接(見圖)
選擇彩色模式之後Login控件應該看上去如圖所示
默認情況下ASPNET 使用Windows認證如果你針對互聯網用戶那麼這種方式不夠靈活因此你應該把認證方式從默認的Windows方式改變到表單認證方式
添加一個nfig文件到你的工程(在工程名字上單擊右鍵在解決方案資源管理器中並選擇Add New Item 從可用的列表選項中選擇Web Configuration File)
在nfig中通過增加下列的幾行代碼從Windows認證方式改變到表單認證方式你使用表單認證這樣你可以添加用戶到你的Web站點而不需要在Windows下創建新的用戶帳戶
<systemweb>
<authentication mode=Forms/>
三 把一新用戶添加到你的應用程序
在你繼續測試該應用程序之前你需要為該應用程序創建一新用戶你可以使用ASPNET Web站點管理工具(WAT)來添加一新用戶到你的應用程序為了激活WAT選擇Website然後選擇ASPNET Configuration(見圖)
圖Web站點管理:該圖顯示怎樣激活WAT
該WAT將被顯示在一新的網頁中點擊Security鏈接跳轉到Security選項卡(見圖)
圖WAT:這裡顯示出WAT的用戶接口
這個Security選項卡允許你執行任務例如創造並刪除用戶以及為你的應用程序創建角色和存取規則點擊Create user鏈接以添加一新用戶到你的應用程序(見圖)
圖WAT安全:選擇WAT中的Security選項卡能夠讓你管理安全特性
為該新建用戶帳戶提供必需的信息(見圖)注意這裡的口令必須是數字字母和特殊的字符的結合請確保至少為該口令提供個字符點擊Create User以添加一個新用戶
圖增加用戶:該圖顯示出WAT安全屏幕在此你可以添加新的用戶帳戶
現在你已准備好測試該應用程序了在解決方案資源管理器中選擇Defaultaspx然後按下F鍵點擊Login鏈接以登錄到應用程序中然後輸入帳戶信息當你成功地登錄到應用程序時Login鏈接改變為Logout圖顯示出這些事件順序
圖登錄:這三個屏幕顯示在用戶登錄到應用程序時的完整過程
四 創建新用戶
你需要設置CreateUserWizard控件的ContinueDestinationPageURL屬性這樣在用戶點擊Continue按鈕時它就能夠被重定向到另一個頁面如一個歡迎頁面
除了為用戶創建用戶帳戶外你也可以允許用戶為自己創建新帳戶這在有些場所下很有用為了存取你的應用程序例如在一個討論論壇你允許用戶創建自由帳戶
為了允許用戶創建新帳戶可以使用CreateUserWizard控件把CreateUserWizard控件拖放到Defaultaspx並應用彩色模式該控件看去應該如圖所示
圖CreateUserWizard控件:這個控件讓用戶創建他們自己的新用戶帳戶
為測試應用程序可以按下鍵F現在你自己可以創建一個新的用戶帳戶(見圖)提供必要的信息並點擊Create User
五 用戶信息的存儲位置
到目前為止你已經看到了怎樣使用WAT和CreateUserWizard控件來創建用戶你可能想知道這個信息被存儲在哪兒如果你現在查看解決方案資源管理器並且刷新App_Data文件夾(右鍵點擊它並且選擇刷新文件夾)你就會看到一個名為ASPNETDBMDF的項(見圖)
圖你將在解決方案資源管理器的此處找到ASPNETDBMDF數據庫文件
圖自動創建的用戶:該圖顯示出一個用戶創建一新的用戶帳戶
在用戶創建成功後你會看到如圖所示的屏幕
圖創建帳戶:在創建一新帳戶後用戶會看到此屏幕
這個ASPNETDBMDF是一個SQL Server 速遞數據庫默認地ASPNET 使用之來存儲應用程序相關的數據例如用戶帳戶配置等等為了分析這個數據庫雙擊它則你會看到它的內容顯示在Database Explorer中(見圖)具體地說aspnet_Membership和aspnet_Users表格將用來存儲你在前面創建的用戶帳戶信息為了觀看表格的內容只須右擊表格名字並選擇Show Table Data
圖數據庫ASPNETDBMDF:你可以在Database Explorer格子中探索ASPNETDBMDF數據庫
ASPNET 的一個很好的特點是不必要創建定制的數據庫來存儲你的用戶的信息並且你甚至不需要擔心把用戶的口令進行散列化處理來安全地存儲它們ASPNET 自動地為你做這件事情
六 會員供給者模型工作原理
ASPNET 使用一種新型的安全模型稱為會員供給者模型這個模型通過使開發者能夠選擇添加安全特性到他們的應用程序的方式來允許最大程度的靈活性和擴展性
作為這個供給者模型擴展性的一個實例請考慮一下新的安全(登錄)控件你已在本文中看到過這些控件API以及構成該新模型的供給者顯示於下圖中
圖會員供給者模型:該圖顯示了本文所討論的控件和會員供給者模型的各個層之間的關系
在最頂層上是各種的Web服務器控件例如LoginLoginStatus和LoginView控件在該控件下面是API它們執行要求其完成的任務Membership類負責處理如添加和刪除用戶等的任務而MembershipUser類負責管理用戶的信息如口令口令問題等等這些會員API使用會員供給者來保存或進行持續性存儲Visual Studio 與一個缺省的會員供給者一同發行SQL Server Express Membership Provider會員供給者的角色是充當會員API和數據存儲之間的橋梁以便信息能夠被持續性存儲而不需要開發者編寫低層代碼來存取數據
如果微軟提供的供給者不能滿足你的需要你或者可以擴展它們或者編寫你自己的例如如果你想要用一個XML文檔而不是一個關系數據庫(例如SQLServer)來保存你的站點的會員信息你可以編寫你自己的供給者來實現與XML文件的對話
七 恢復丟失的口令
恢復/清除丟失的口令是你作為一個管理員需要執行的一項普通任務PasswordRecovery控件允許用戶自己執行這項普通任務通過自動地檢索口令然後用電子郵件把它發送給用戶
僅在你以普通文本存儲口令而不是對口令的散列值進行存儲時口令恢復才是重要的然而默認情況下在nfig文件中的設置指定所有的口令在把它們存儲到成員數據庫之前要被散列化處理nfig默認情況下也不允許口令恢復
為了在普通文本中存儲用戶口令你可以在文件nfig中添加下列入口
<systemweb>
<membership
defaultProvider=SqlProvider
userIsOnlineTimeWindow=>
<providers>
<clear />
<add
name=SqlProvider
type=SystemWebSecuritySqlMembershipProvider
connectionStringName=LocalSqlServer
applicationName=SecurityControls
enablePasswordRetrieval=true
enablePasswordReset=true
requiresQuestionAndAnswer=true
requiresUniqueEmail=true
passwordFormat=Clear />
</providers>
</membership>
具體地說你現在清除了所有的會員供給者然後添加一個新的SqlMembershipProvider注意為了允許口令檢索你需要設置enablePasswordRetrieval(為真)和passwordFormat(清除之)屬性
如果你設置了passwordFormat為散列化的那麼你必須把enablePasswordReset設置成假
現在拖動PasswordRecovery控件到Defaultaspx然後應用彩色模式該PasswordRecovery控件現在看起來象圖
圖PasswordRecovery控件通過使用這個控件用戶能夠恢復他們忘記的口令
在PasswordRecovery控件的屬性窗口中設置MailDefinition屬性下的From和Subject字段如圖所示
圖PasswordRecovery控件屬性:如何在屬性浏覽器中配置你的PasswordRecovery控件
另外你需要在你的機器上配置好SMTP服務以便用PasswordRecovery控件來發送一電子郵件為在你的機器上配置該SMTP服務啟動WAT選擇應用程序然後選擇配置SMTP電子郵件設置
為測試應用程序按下F鍵你將被提示輸入你的用戶名然後是你的安全問題如果該安全問題的答案是正確的那麼口令將被以電子郵件形式發送給你否則在該頁面將顯示給你一錯誤消息如圖所示
圖恢復一丟失的口令:用戶在恢復一個丟失的口令的過程中會看到這個屏幕序列
為了安全原因通過電子郵件發送口令給用戶不是一個好注意因此你確實需要小心地考慮使用這一選擇
八 改變口令
除了恢復失去的口令外你還需要允許用戶改變他們的口令在ASPNET 中你可以通過使用ChangePassword控件來完成這項任務
既然一個用戶只有在登錄後才能改變他們的口令那麼你現在將要在你的應用程序(該程序僅為認證的用戶所存取)中創建一新文件夾
你可以添加一新文件夾到你的應用程序通過右擊解決方案資源管理器中的工程名然後選擇Add Folder再選擇Regular Folder命名文件夾為Members現在在該新文件夾上添加一新的表單(右擊Members然後選擇Add New Item)命名該新建Web表單為ChangePasswordaspx(見圖)
圖這裡顯示的是在工程上增加文件夾後的解決方案資源管理器
為限制到成員文件夾的存取添加下列<location>元素到nfig
</systemweb>
<location path=Members>
<systemweb>
<authorization>
<deny users=? />
</authorization>
</systemweb>
</location>
</configuration>
實質上在成員文件夾中的頁面只能為認證過的用戶(所有的匿名用戶(?)將被否認存取)所存取
拖放ChangePassword控件到ChangePasswordaspx之上並且應用彩色模式(見圖)
圖ChangePassword控件:通過使用這個控件使你容易地實現讓用戶改變他們的口令
為了測試該應用程序在解決方案資源管理器的成員文件夾中選擇ChangePasswordaspx文件並且按下F鍵你將首先被重定向到loginaspx頁面(為了認證)並且一旦被認證ChangePasswordaspx頁面將被裝載現在你可以改變你的口令了(見圖)
圖改變口令:用戶在用ChangePassword控件改變口令時可能會看到這個屏幕序列
From:http://tw.wingwit.com/Article/program/net/201311/13242.html