閱讀482 返回首頁    go 阿裏雲 go 技術社區[雲棲]


使用更精簡的代碼保證ASP.NET應用程序的安全

我編譯了許多Microsoft®ASP.NET應用程序,例如客戶端應用程序和原型、我自己不斷增長的站點和幫助不會編程的家人和朋友所開發的站點,以及文章、演示文稿和培訓課程的代碼。我經常發現自己在編譯每個應用程序時,總有某些重複的任務要做,這其中很大一部分是定義驗證模型。保護應用程序資源幾乎是設計任何應用程序時必不可少的一項工作。ASP.NET1.x讓事情變得簡單了些,它提供了一個頗為簡單和安全的、基於表單的驗證進程,但您仍要糾纏於角色管理和其他工作之中。如果每設計一個新登錄表單可以掙5美分,那麼我現在至少已經掙了10多美元,算一算,我設計了多少個表單。即將發行的新版本ASP.NET的開發代號是“Whidbey”(與即將發行的新版本Microsoft®VisualStudio®.NET的開發代號一致),它提供了許多新的配置工具、控件和組件,以支持用於驗證用戶和管理受保護資源的完整係統。這些新功能十分直觀易用,即使您的祖母也能在一天內構建一個安全站點。

直觀易用的功能

按照傳統做法,為新Web站點構建一個驗證模型通常包括以下步驟:收集受保護資源和活動的要求,並定義適當的角色和權限。 設計關係數據庫表,以存儲用戶、角色及相關權限。 設計登錄頁麵。 編寫代碼,以驗證用戶並收集關聯的角色和權限。 添加配置,以基於角色來保護Web資源。 編寫代碼,以基於角色和權限來控製頁麵內容。

即使隻是構建幾個可重複使用的組件來封裝上述某些重複性任務,您仍會感到肩上的工作負擔減輕了不少。ASP.NETWhidbey的新組件大大減少了上述步驟中的五個步驟的工作量,至少將其減少為了原來工作量的一部分。我將使用新的基於Web的管理向導來自動創建一組表,以處理用戶、角色和權限。在同一個管理界麵中,我還會就登錄、成員身份和角色管理對應用程序進行配置。我將在一秒鍾(或者說僅僅是在Web表單中拖放一個登錄控件的時間)之內設計出一個登錄頁麵,而且我根本不用編寫一行用於驗證用戶或關聯角色的代碼,因為這些會自動完成。根據用戶角色和登錄狀態的不同,呈現的菜單和頁麵內容也將不同,但我同樣無需為此編寫任何代碼。

是不是有夢想成真的感覺?讓我們看看這是如何實現的。

配置界麵

ASP.NETWhidbey包括一個新的基於Web的配置工具,它運行於特定應用程序的上下文中,這樣便可以通過交互的方式來修改應用程序自身的web.config文件。該工具帶有許多向導,其中一個可以引導您完成設置安全選項的全部步驟。使用VisualStudio“Whidbey”完成新Web站點的創建後,您可以通過兩種方法啟動該配置工具:從“SolutionExplorer”(解決方案資源瀏覽器)中選擇“ASP.NETConfiguration”(ASP.NET配置)圖標或從“Website”(站點)菜單中選擇“ASP.NETConfiguration”(ASP.NET配置)。

圖1:從“SolutionExplorer”(解決方案資源瀏覽器)或主菜單啟動基於Web的配置實用工具。

配置Web界麵啟動時會顯示一個查詢字符串,指示要配置的應用程序目標。在本文中,我創建了一個名為“MySecureNewsletter”的新應用程序,並啟動了管理界麵,如下所示:

圖2:在我的計算機上啟動管理界麵的URL是https://localhost:10245/ASP.NETWebAdminFiles/default.aspx?applicationPhysicalPath=H:/WebSites/MySecureNewsletter/&applicationUrl=/MySecureNewsletter。

“Security”(安全)選項卡中的一個選項是運行“SecuritySetupWizard”(安全設置向導)。對於一個新應用程序,應當首先運行該向導。向導界麵的左側麵板顯示了將要逐步執行的步驟列表,並指出您當前所在的步驟:

圖3:安全設置向導使用ASP.NETWhidbey的某些其他很酷的功能,例如用於導航的向導控件。

設置過程中的步驟非常簡單,所以在此僅概述我為示例應用程序所選的選項。首先,向導詢問我該站點是Intranet站點還是Internet站點。前者默認使用Windows驗證,後者(也是我的選擇)將把應用程序配置為使用表單驗證。下一步,向導顯示創建數據庫以存儲用戶和角色的選項。如果選擇此選項,向導將詢問我是選擇創建MicrosoftAccess數據庫還是創建MicrosoftSQLServer™數據庫,然後引導我完成幾個附加的步驟。我沒有選擇這個選項,所以在應用程序的/Data目錄下將創建一個默認的Access數據庫。在machine.config文件中,<connectionString>元素指定了Access數據庫的默認位置:

<connectionStrings><addname="LocalSqlServer"connectionString="datasource=127.0.0.1;IntegratedSecurity=SSPI"/><addname="AccessFileName"connectionString="~/DATA/ASPNetDB.mdb"/></connectionStrings>

下一步,我啟用了該應用程序的角色管理。此時,將創建帶有大量表格的默認Access數據庫,並且最終將由新的安全控件和成員身份API來使用這些表。此時,我可以選擇創建角色和用戶。創建每個角色時都需要使用簡單的字符串值,如下所示:

圖4:界麵左側的向導麵板顯示我正在對應用程序的安全模型執行哪一步設置。

要創建用戶,需要設想一下您可能希望為每個用戶收集哪些字段,特別是用戶名、密碼、電子郵件、說明和可選密碼問題及答案。如果已創建了任何角色,則這些角色顯示為複選框選項的形式以供選擇:

圖5:此處輸入的電子郵件字段以後將用於與用戶進行交互,例如在用戶取回密碼時。

通過以上幾個簡單的步驟,我們已在/Data目錄下創建了一個新數據庫(文件名為AspNetDB.mdb),用於存儲成員身份信息。刷新“SolutionExplorer”(解決方案資源瀏覽器)以後,您還可以看到已創建了一個web.config文件,用於啟用<roleManager>設置中的角色管理。這一步是必需的,因為machine.config中的默認設置是禁用角色管理。新的web.config文件如下所示:

<?xmlversion="1.0"encoding="utf-8"?><configuration><system.web><roleManagerenabled="true"><providers/></roleManager></system.web></configuration>

在以上數個簡短的步驟中,我創建了標準的成員身份和憑據管理數據庫,角色和用戶也創建完畢,並完成了角色管理必需的Web配置,現在我們就可以構建一個安全的應用程序了。

如果沒有在第一次配置過程中完成角色和用戶的創建,您可以隨時返回到該配置工具輸入或修改設置,但我現在將演示如何創建自己的管理頁麵。

拖放安全控件

到文章的本節為止,您依然不需要編寫任何代碼。我將演示如何使用ASP.NETWhidbey的新安全控件來生成一個基於角色的可行的驗證係統。我將從我的示例電子通訊應用程序MySecureNewsletter開始。目前,除了我剛剛在向導中完成的步驟以外,尚未生成任何安全模型。順便說一句,這個應用程序使用了Whidbey新的“母版頁”功能。關於該功能的詳細信息,請參閱

圖6:示例應用程序中的所有*.aspx頁麵都將使用一個母版頁作為布局模板。內容頁麵和Web表單頁麵一樣,但前者指定了母板頁模板,且所有的內容都放在內容控件中。

登錄

添加名為login.aspx的新內容頁麵以後,我們可以開始享受些樂趣了。“Toolbox”(工具箱)帶有“Security”(安全)選項卡,其中列出了ASP.NETWhidbey中與安全性相關的非常酷的新控件。

圖7:“ToolBox”(工具箱)已經針對ASP.NETWhidbey進行了重新組織,新的安全控件將集中到它們自己的選項卡上。

我將從剛剛拖放到新的login.aspx頁麵上的“Login”(登錄)控件開始,一個個地瀏覽這些安全控件:

圖8:登錄控件提供了編輯控件默認布局的交互式設計器界麵。

您可以選擇某一個“AutoFormat”(自動套用格式)選項來為控件外觀選擇一個已封裝的格式:

圖9:目前有兩個已封裝格式可用,但如果應用程序使用了默認樣式表,您還可以通過“Properties”(屬性)窗口為控件的各個元素指定樣式。

“Properties”(屬性)窗口還提供了對控件各個元素的標記、值和驗證錯誤消息的訪問。您也可以自定義登錄按鈕的外觀,並提供創建新成員的鏈接。現在,讓我們看看使用可信任的樣式表和控件默認選項會生成些什麼。控件生成的源代碼如下所示:

<asp:loginrunat="server"></asp:login>

這樣,我的登錄頁麵就完成了。因為我已經配置了應用程序的用戶和角色,所以我僅需修改web.config文件,把驗證模式設置為“Forms”(表單),因為默認方式是“Windows”驗證。同時,為了測試登錄進程,我還將拒絕匿名用戶:

<authenticationmode="Forms"/><authorization><denyusers="?"/></authorization>
注意:我早先曾提及安全設置向導將應用程序配置為使用表單驗證,該向導是通過生成默認數據庫以存儲憑據來完成該配置的。該向導並不是(在WhidbeyAlpha版本中)通過修改應用程序的web.config文件中的<authentication>設置來指定如上所示的表單驗證模式。

現在,係統將引導所有的匿名用戶前往登錄頁麵(幸好使用了母版頁和樣式表,在花了一秒鍾將登錄控件拖動到表單後,這個頁麵看起來還過得去):

圖10:在沒有修改任何屬性的情況下,這是在頁麵模板中顯示的登錄控件的默認外觀。

誰已經登錄了?

如果輸入了有效的用戶名和密碼,“LogIn”(登錄)按鈕將自動驗證用戶,並將其重定向到最初請求的頁麵。當然,登錄以後,習慣上要為用戶顯示個性化的歡迎頁麵,並提供注銷的途徑。我將把這兩個功能添加到顯示在每個頁麵中的menus.ascx用戶控件。“LoginName”(登錄名)控件顯示了已驗證的用戶名,而“LoginStatus”(登錄狀態)控件則提供了一個方便的超級鏈接,它會根據當前驗證狀態,在登錄和注銷操作之間切換。以下是將這兩個新控件添加到menus.ascx文件的適當位置後的HTML源代碼:

當前您已登錄為:<asp:loginnamerunat="server"></asp:loginname><asp:loginstatusrunat="server"></asp:loginstatus>

噢,這太粗略了。現在有了登錄頁麵,讓我們看看用戶登錄以後顯示的個性化歡迎頁麵,同時我們還為用戶提供了注銷的途徑,所有這些都不需要編寫代碼。

圖11:在Login(登錄)/Logout(注銷)之間切換

登錄名控件隻執行一個任務:顯示已驗證用戶的名稱。默認情況下,登錄狀態控件自動在Login(登錄)/Logout(注銷)之間切換,但可以使用模板進一步自定義。注銷的實際進程也由該控件進行封裝。

關於此個性化歡迎頁麵的唯一問題是:在登錄之前,頁麵會顯示空白用戶名,我們可能需要編寫一些代碼來控製這一部分。不過,也許我們同樣可以不用編寫代碼就能做到。

控製對內容的訪問

如果使用以前的ASP.NET版本來顯示當前已驗證的用戶,我們需要編寫代碼來訪問當前上下文的用戶標識。要僅在用戶驗證後顯示該信息,還需要編寫更多的代碼來檢查用戶的狀態。“LoginView”(登錄視圖)控件可能是最有意思的新安全控件之一,它讓我們能夠基於驗證狀態和角色來控製頁麵內容。為了檢驗這一點,我向menu.ascx文件添加了一個登錄視圖控件。通過與設計環境進行交互,您可以編輯希望匿名用戶(尚未登錄)或已驗證用戶所看到的信息。

圖12:“CommonLoginViewTasks”(通用登錄視圖任務)使您可以在視圖之間切換,或通過單擊“EditTemplates”(編輯模板)超級鏈接開始編輯模板。

您始終可以通過“Source”(源文件)視圖直接修改HTML。以下代碼顯示了向menus.ascx文件的個性化歡迎頁麵中添加登錄視圖控件時所做的修改:

<asp:loginviewrunat="server"><anonymoustemplate>您目前尚未登錄。</anonymoustemplate><loggedintemplate>當前您已登錄為:<asp:loginnamerunat="server"></asp:loginname></loggedintemplate></asp:loginview>

登錄視圖控件在用戶尚未通過驗證時顯示<anonymoustemplate>節的內容,用戶通過驗證後顯示<loggedintemplate>節的內容。所以,沒有編寫任何代碼,我們已利用安全控件為用戶提供了登錄頁麵、注銷功能、個性化歡迎頁麵和基於驗證狀態的自定義頁麵內容。

什麼?忘記了密碼?

您肯定會覺得難以置信,自動管理密碼就是如此簡單。“PasswordRecovery”(密碼取回)控件提供了功能完善的密碼取回係統,包括基於密碼問題查找密碼以及自動重設密碼,並通過電子郵件將密碼發送給用戶。我在應用程序根下創建了密碼取回頁麵,在將密碼取回控件拖放到頁麵後,我看到了以下內容:

圖13:“CommonPasswordRecoveryTasks”(通用密碼取回任務)使您可以自定義該過程中的每一步驟的外觀。

密碼管理設計的大量活動都是可以配置的。例如,您可以要求用戶創建密碼問題和答案,並將其作為密碼安全模型的一部分。PasswordRecovery控件包括這樣一個界麵,要求用戶回答他們在創建帳號時提供的密碼問題。如下所示,您可以編輯密碼取回的每一部分的設置,包括請求用戶名、詢問密碼問題,以及完成該過程後顯示對用戶的響應。

圖14:密碼問題和答案的形式可由成員身份提供程序(本文稍後將介紹)進行配置。

此控件自動重設密碼,並將新密碼發送到用戶的電子郵件帳號。生成的電子郵件的屬性可通過控件的公共屬性進行配置。在示例程序中,我自定義了電子郵件的主題標題和發件人的地址。所生成的HTML如下所示:

<asp:passwordrecoveryrunat="server"><maildefinitionbodyformat="Html"subject="PasswordRecoveryforMySecureNewsletter"from="mailto:mailadmin@dotnetdashboard.com"></maildefinition></asp:passwordrecovery>

如果正確地配置了用於發送電子郵件的SMTP服務器,我將接收到包含新密碼的電子郵件:

圖15:通過在“Properties”(屬性)窗口中設置“BodyFilename”和“BodyFormat”屬性,可以提供電子郵件的HTML模板。

在示例中,我使用自己的SMTP服務器測試了該功能,而您將在web.config文件中看到SMTP設置的這個示例:

<smtpMailserverName="smtp.mysmtpserver.com"serverPort="25"></smtpMail>

這是一個奇妙的功能,為處理密碼管理提供了快速的安全方案。但對於大型站點,您很可能希望進一步了解組件的體係結構。例如,您希望確保生成電子郵件的組件具有可伸縮性,您還可能想編寫一些代碼來控製如何通過電子郵件向成員發送密碼:也許是提供對顯示解密密碼的已過期Web頁麵的鏈接。

按角色過濾內容

大多數應用程序依賴角色來控製對資源的訪問、信息顯示方式和可允許的活動。此前,我創建過許多用戶,並使用安全管理工具來為其指定角色。如果是在ASP.NET的以前版本中使用這些角色,我就得編寫代碼,以從已驗證的用戶的憑據存儲中手動檢索角色。LoginView控件通過配置的成員身份提供程序(或者是成員身份API)與這些角色進行交互,並支持為任何有效角色提供內容模板。

假定我將把一組僅能由管理員訪問的管理頁麵添加到應用程序。如果向標題中一個“Admin”(管理)菜單項,我很可能希望其僅對管理員顯示。為了實現這一點,我將把另一個登錄視圖控件添加到菜單界麵。LoginView控件的某個屬性(可通過“Properties”[屬性]窗口訪問)支持通過對話框界麵將角色列表添加到“RoleGroups”(角色組)集合:

圖16:“RoleGroupCollectionEditor”(角色組集合編輯器)要求手動輸入角色。您也可以為角色編組,這樣多個組可以共享同樣的模板界麵。

在“Design”(設計)視圖中,LoginView控件現在將角色列表顯示為模板選項:

圖17:“HTML”視圖將更新,顯示您為每個角色所設計的所有模板。

從以下HTML源文件中可以看出,“Admin”(管理)和“Member”(成員)角色使用了新的內容模板。在驗證以前仍將使用<anonymoustemplate>,但驗證以後,將使用與某個用戶角色匹配的第一個模板。如果未找到匹配項,默認使用<loggedintemplate>設置。

<asp:loginviewrunat="server"><anonymoustemplate><asp:loginstatusrunat="server"></asp:loginstatus></anonymoustemplate><rolegroups><asp:rolegrouproles="Admin"><contenttemplate><tr><td><asp:hyperlinkrunat="server"navigateurl="~/default.aspx">Home</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:hyperlinkrunat="server"navigateurl="~/about.aspx">About</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:hyperlinkrunat="server"navigateurl="~/admin/manageMembers.aspx">Admin</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:loginstatusrunat="server"></asp:loginstatus></td></tr></contenttemplate></asp:rolegroup><asp:rolegrouproles="Member"><contenttemplate><tr><td><asp:hyperlinkrunat="server"navigateurl="~/default.aspx">Home</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:hyperlinkrunat="server"navigateurl="~/about.aspx">About</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:loginstatusrunat="server"></asp:loginstatus></td></tr></contenttemplate></asp:rolegroup></rolegroups><loggedintemplate><tr><td><asp:hyperlinkrunat="server"navigateurl="~/default.aspx">Home</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:hyperlinkrunat="server"navigateurl="~/about.aspx">About</asp:hyperlink>&nbsp;|&nbsp;</td><td><asp:loginstatusrunat="server"></asp:loginstatus></td></tr></loggedintemplate></asp:loginview>

將按照顯示的順序分析這些模板,並將第一個匹配的角色用作該登錄控件的內容。這意味著必須仔細地為角色安排適當的順序。我的示例程序的結果是將新的“Admin”(管理)菜單項限製為隻對分配了管理角色的用戶顯示。

我們還可以指定<authorization>規則拒絕或允許特定的角色,從而實現使用角色來控製對其他資源的訪問。可以使用<location>標記在web.config文件的應用程序級別實現這一點,或是將web.config文件添加到受保護的子目錄。我在示例程序的/admin目錄下放置了以下<authorization>設置,隻允許那些指定為管理角色的用戶訪問:

<authorization><allowroles="Admin"/><denyusers="*"/></authorization>

現在,可以創建一些管理頁麵來管理成員,並根據ASP.NETWhidbey提供的成員身份API來編寫代碼。

成員身份和角色提供程序

至此,我所顯示的大多數內容都是基於使用新的安全控件。但是,有一些基礎組件允許我們直接管理用戶和角色。這些組件提供了從數據庫訪問層抽象而來的層。為了進行演示,我將在/admin目錄下創建一個新的內容頁麵(manageMembers.aspx)。該頁麵將顯示電子通訊成員的列表,並提供了一個中心界麵,用於添加、編輯或刪除電子通訊成員。

我將“DataView”(數據視圖)控件拖放到頁麵中,目的是使用用戶列表填充此控件。Page_Load事件包含了利用內部成員身份對象檢索所有用戶的代碼。新的Membership類的方法和屬性提供了對默認創建的成員身份數據庫的直接訪問。例如,GetAllUsers()返回了應用程序的MembershipUser對象的集合。以下代碼將返回的集合轉換為可以綁定到DataView控件的格式(用於Alpha版本的解決方案,因為該版本中不能綁定集合):

MembershipUserCollectionmembers=Membership.GetAllUsers();ArrayListarr=newArrayList();foreach(MembershipUsermemberinmembers){arr.Add(member);}GridView1.DataSource=arr;GridView1.DataBind();

在該頁麵中,用戶可以添加、編輯或從列表刪除成員。刪除鏈接需僅執行以下代碼行:

Membership.Provider.DeleteUser(user);

添加和編輯成員由所創建的另一個新頁麵(newMembers.aspx)來處理。添加新成員時,該頁麵收集要添加到成員數據庫的新成員的必需信息。就我的電子通訊而言,我將收集新成員的電子郵件地址和密碼,僅此而已。但是,數據庫支持一個用戶名和一個電子郵件地址,所以我同時使用電子郵件地址來填充這兩個字段。此外,我將收集新用戶的角色選擇。這意味著我必須編寫代碼,以動態列出應用程序中所有可用的角色。

Page_Load事件包含用於加載可用角色的代碼。我將使用“Repeater”控件來動態構建一個複選框列表(與安全配置向導中的列表類似)。

//從newMember.aspx<asp:repeaterrunat="server"><itemtemplate><asp:checkboxrunat="server"text='<%#Container.DataItem.ToString()%>'checked="<%#m_theUser==null?false:Roles.IsUserInRole(m_theUser.Username,Container.DataItem.ToString())%>"/><br/></itemtemplate></asp:repeater>//從newMember.aspx.csroleRepeater.DataSource=Roles.GetAllRoles();roleRepeater.DataBind();

所生成的輸入頁麵如下所示:

圖18:您也可以為自己的成員管理進程添加重設密碼、更改密碼和密碼問題及答案功能。

我必須手動設計該頁麵,但其中添加新用戶所需的代碼很少,因為可以再次使用成員身份組件:

Membership.CreateUser(email.Text,pw.Text,email.Text);

我們需要多編寫幾行代碼,以從Repeater控件中提取角色選擇,然後用該用戶的提取結果填充角色表。同樣,訪問角色數據庫是很容易的,這次使用的是“Roles”(角色)組件:

string[]users={email.Text};string[]addRoles=newstring[roleRepeater.Items.Count];string[]remRoles=newstring[roleRepeater.Items.Count];intaddIndex=0;intremIndex=0;foreach(RepeaterItemitminroleRepeater.Items){CheckBoxc=(CheckBox)itm.FindControl("chkRole");stringrole=c.Text;if(c.Checked&&!Roles.IsUserInRole(users[0],role))addRoles[addIndex++]=role;elseif(!c.Checked&&Roles.IsUserInRole(users[0],role))remRoles[remIndex++]=role;}if(addIndex>0){string[]theRoles=newstring[addIndex];Array.Copy(addRoles,0,theRoles,0,addIndex);Roles.Provider.AddUsersToRoles(users,theRoles);}if(remIndex>0){string[]theRoles=newstring[remIndex];Array.Copy(remRoles,0,theRoles,0,remIndex);Roles.Provider.RemoveUsersFromRoles(users,theRoles);}

同一newMembers.aspx頁麵可以用於編輯用戶,查詢字符串則用於指示當前的模式。在編輯模式中,Page_Load將使用用戶信息和當前角色填充界麵。同樣,Membership類提供了查找特定用戶記錄和更新已更改用戶記錄的方法。如果我使用純文本密碼,並且在成員身份提供程序配置設置中啟用了密碼檢索,那麼以下代碼將更新用戶的密碼更改:

MembershipUseruser=Membership.GetUser(email.Text);user.ChangePassword(user.GetPassword(),this.pw.Text);

默認情況下,GetPassword()將失敗,因為對所添加的安全性安裝了每個成員身份提供程序的machine.config設置。此外,散列密碼是提供程序的默認、也是推薦的方式。因為散列密碼不可檢索,所以您將必須從用戶界麵收集用戶的舊密碼,以調用ChangePassword()函數。

但是,這個程序是可擴展的嗎?

至此,我一直側重於如何才能更輕鬆地實現驗證和基於角色的訪問控製。雖然這些已封裝的功能可以滿足您百分之八十的需求,您還可以非常容易地擴展該模型。

數據庫創建

例如,可以直接通過安全配置向導將數據庫創建過程擴展為支持SQLServer數據庫,或是另一個自定義的Access數據庫。如果在向導的步驟中選擇創建一個新數據庫,您將看到如下的示例圖:

圖19:安全向導將在您所選擇的本地或遠程數據庫中創建默認的一組成員身份管理表。

您可以在應用程序的SQLServer數據庫中直接創建成員身份表,而不是使用無法進行任何擴展的Access數據庫。這是我認為有進步的地方。也許您的祖母無法知道完成該步驟所需的數據庫名稱和憑據,但您的開發小組肯定知道。係統將封裝所創建的表,以匹配成員身份和角色提供程序(這兩者用於實現上述功能)的需要。但如果計劃編譯自己的提供程序,您可以使用其他表設計,並跳過這一步。

身份管理

您可能從我們編寫的、用於構建某些管理功能的代碼中發現,對憑據存儲的訪問由成員身份和角色提供程序進行處理。System.Web.Security命名空間現在包括新的SqlMembershipProvider和AccessMembershipProvider組件,以管理各自對默認憑據表的數據訪問需求。默認情況下,machine.config文件的<membership>元素包括兩個提供程序,分別用於SQLServer數據庫和Access數據庫。<providers>節可用於添加或刪除提供程序,這允許您在應用程序級別刪除這些默認的提供程序,並配置自己的提供程序。從以下設置中可以看到,有一些與向導創建的表結構直接相關的預定義設置,包括密碼加密設置、密碼重設和檢索設置、密碼問題及答案的要求設置,以及電子郵件字段輸入內容的唯一性設置。其中的每一項都由各自的默認成員身份(或數據庫)提供程序來強製執行,這使您可以使用多種方法使用已封裝的表結構,而不是通過創建自己的表和提供程序。您也可以替代各個提供程序所用的連接字符串。

<membershipdefaultProvider="AspNetAccessProvider"userIsOnlineTimeWindow="15"><providers><addname="AspNetSqlProvider"type="System.Web.Security.SqlMembershipProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"connectionStringName="LocalSqlServer"enablePasswordRetrieval="false"enablePasswordReset="true"requiresQuestionAndAnswer="false"applicationName="/"requiresUniqueEmail="false"passwordFormat="Hashed"description="從本地MicrosoftSQLServer數據庫中存儲和檢索成員身份數據"/><addname="AspNetAccessProvider"type="System.Web.Security.AccessMembershipProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"connectionStringName="AccessFileName"enablePasswordRetrieval="false"enablePasswordReset="true"requiresQuestionAndAnswer="false"applicationName="/"requiresUniqueEmail="false"passwordFormat="Hashed"description="從本地MicrosoftAccess數據庫中存儲和檢索成員身份數據"/></providers></membership>

實際上,還有另一個成員身份提供程序組件System.Web.Security.ADMembershipProvider。該組件對ActiveDirectory存儲執行上述同樣的活動,但目前這隻是內部功能。

<roleManager>節中的配置設置可以控製使用何種數據存儲來訪問相關的角色信息。默認情況下有三種配置設置:SqlRoleProvider、AccessRoleProvider和WindowsTokenRoleProvider。這些組件用於處理用戶所有的角色管理。同樣,將為SQLServer數據庫和Access數據庫創建一組默認表,WindowsTokenRoleProvider調用未托管的代碼來訪問為操作係統憑據存儲而定義的角色。

<roleManagerenabled="false"cacheRolesInCookie="true"cookieName=".ASPXROLES"cookieTimeout="30"cookiePath="/"cookieRequireSSL="false"cookieSlidingExpiration="true"cookieProtection="All"defaultProvider="AspNetAccessProvider"><providers><addname="AspNetSqlProvider"type="System.Web.Security.SqlRoleProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"connectionStringName="LocalSqlServer"applicationName="/"description="從本地MicrosoftSQLServer數據庫中存儲和檢索角色數據"/><addname="WindowsToken"type="System.Web.Security.WindowsTokenRoleProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"description="從請求的Windows已驗證令牌檢索角色數據"/><addname="AspNetAccessProvider"type="System.Web.Security.AccessRoleProvider,System.Web,Version=1.2.3400.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a"connectionStringName="AccessFileName"applicationName="/"description="從本地MicrosoftAccess數據庫文件中存儲和檢索角色數據"/></providers></roleManager>

雖然此提供程序模型主要旨在簡化Web應用程序的表單驗證,但也可用於創建並管理用戶和角色的任意驗證方案,還可執行通用活動,如密碼重設、密碼加密和用戶驗證。

小結

ASP.NETWhidbey中的新組件和體係結構功能令人讚歎不已。新功能真正讓人欣賞之處在於,您可以輕易地把各種功能組合在一起,構建成一個完整的應用程序,此外,對於需要具有可伸縮性的企業級應用程序,您可以非常容易地擴展這些功能。安全性也有了顯著的加強。使用新模型使我們可以和使用XML配置文件開發可憐的“演示代碼”說再見(這些XML配置文件保存未加密的憑據,並增加了服務器的文件訪問負載)。當截至日期臨近時,我們經常冒險發行演示代碼。為什麼不在第一次就開發出正確的代碼呢?現在唯一欠缺的是心靈感應設備驅動程序,可以將我的想法實時轉換成代碼。

最後更新:2017-04-02 00:06:33

  上一篇:go 使用.NET實現斷點續傳
  下一篇:go ASP.NET中的HTTP模塊和處理程序