尊重作者,請保留 www.it55.com 連結字樣。
每一個完善的網站管理系統都應該包括使用者管理、角色管理,都包含使用者註冊、密碼修改、使用者登入、身分識別驗證等功能。在asp.net 1.x時代,程式員為了這些常用的功能反覆做著重複性的工作,今天的asp.net 2.0替我們封裝了這些常用控制項及機制,給我們帶來了諸多便利。接下來兩節我們就來學習這方面的內容。
這一節我們講述asp.net 2.0的成員資格和角色管理部分。
1、asp.net的身分識別驗證方式
asp.net的身分識別驗證方式有4種:Windows驗證、Passport驗證、None驗證、Forms驗證。在我們的Web應用程式開發中,Forms驗證方式是最常用的,所以這裡我們只涉及Forms驗證。
asp.net 2.0網站的身分識別驗證資訊除了可以像常規程式那樣儲存在Cookie中之外,還提供了一種Url儲存會話的方案,即“無Cookie會話功能”。“無Cookie會話功能”是為了避免用戶端因為屏蔽了Cookie功能而無法進行身分識別驗證的情況而設計的,但是這個功能同時也帶來了安全隱患,所以仍然建議使用Cookie會話方案。
基於Forms的身分識別驗證時,需要設定Web.config網站設定檔,設定<system.web>元素下的<authentication> 元素的 <forms> 子項目:
<authentication mode="Forms">
<forms name=".VS2005_Form" loginUrl="~/Security/Login.aspx" defaultUrl="~/Default.aspx"
protection="All" timeout="30" path="/" requireSSL="false"
slidingExpiration="true" enableCrossAppRedirects="false"
cookieless="UseDeviceProfile">
</forms>
</authentication>
<forms>元素的屬性說明如下
1) cookieless - 身分識別驗證可以將 Forms 身分識別驗證票儲存在 Cookie 中也可以以無 Cookie 的表示形式儲存在 URL 上。有效值如下:
·UseDeviceProfile - 預設值表示 ASP.NET 根據預先計算得到的瀏覽器設定檔來確定儲存票證的位置。
·AutoDetect - 選項使 ASP.NET 動態確定瀏覽器是否支援 Cookie。
·UseUri - 強制實施無 Cookie 票證
·UseCookies - 強制實施有 Cookie 票證。
2) defaultUrl - 指定在成功登入後,請求將重新導向到的預設 URL。
3) domain - 指定包含 Forms 身分識別驗證票的 HttpCookie 的 Domain 屬性的值。顯式設定此屬性可使應用程式共用同一個 Cookie,前提是這些應用程式共用某個 DNS 命名空間的一個公用部分(例如,如果 domain 屬性設定為“cnblogs.com”,則 webabcd.cnblogs.com 和 dudu.cnblogs.com可以共用一個 Cookie)。
4) enableCrossAppRedirects - Forms 身分識別驗證允許以查詢字串變數或表單 POST 變數的形式在應用程式之間傳遞 Forms身分識別驗證票。將此屬性設定為 true 可使 FormsAuthenticationModule 能夠從查詢字串或表單 POST 變數提取票證。
5) loginUrl - 指定未經身分識別驗證的使用者的請求將被重新導向到的 URL。該 URL 可以在同一台電腦上或在遠端電腦上。如果是在遠端電腦上,則兩台電腦上 machineKey 配置元素中的 decryptionkey 和 validationKey 屬性都需要使用相同的值。
6) name - 用於身分識別驗證的 HTTP Cookie 的名稱。注意,如果多個應用程式需要在一台電腦上使用基於表單的驗證服務,並且每個應用程式都希望由應用程式隔離 Forms 身分識別驗證 Cookie,則每個應用程式都應配置一個唯一的 Cookie 值。為避免在 URL 中產生依賴項,在設定身分識別驗證 Cookie 時,ASP.NET 還使用“/”作為 Path 值,以便將這些 Cookie 發送回網站上的每個應用程式。
7) path - 用於發出的 Cookie 的路徑。預設值為“/”,以避免路徑中大小寫不匹配的造成的困難,因為在返回 Cookie 時,瀏覽器是嚴格區分大小寫。共用伺服器環境中的應用程式應使用此指令來維護專用 Cookie。(它們還可以使用 API 在運行時指定路徑來發出 Cookie。)
8) protection - 用於保護 Cookie 資料的方法。有效值如下:
·All - 同時使用資料驗證和加密來保護 Cookie。所配置的資料驗證演算法是基於 <machinekey> 元素的。如果密鑰足夠長(48 個字元),預設情況下將使用 AES 進行加密。All 是預設(和建議)值。
·None - 用於僅將 Cookie 用於個人化並且安全性要求不高的網站。加密和驗證都可以被禁用。儘管以此方式使用 Cookie 需謹慎,但對於使用 .NET Framework 實現個人化的任何方法,此設定提供了最佳效能。
·Encryption - 使用 AES、TripleDES 或 DES 加密 Cookie,但不對 Cookie 進行資料驗證。這類 Cookie 容易受到精心選擇的純文字的攻擊。
·Validation - 不加密 Cookie 的內容,但驗證 Cookie 資料在傳輸過程中是否未被更改。若要建立 Cookie,驗證密鑰在緩衝區中與 Cookie 資料連線,並且計算出 MAC 並將其追加到輸出的 Cookie。
9) requireSSL - 如果設定為 true,則 Forms 身分識別驗證會設定 Forms 身分識別驗證 Cookie 的安全位元。相容的瀏覽器只將 Cookie 通過 SSL 串連發送回 ASP.NET。注意,如果使用無 Cookie Forms 身分識別驗證,則此設定無效。
10) slidingExpiration - 如果設定為 true,則 Forms 身分識別驗證將定期更新 Forms 身分識別驗證票的生存期。無論票證是包含在 Cookie 中,還是以無 Cookie 的格式包含在 URL 中,都會進行此操作。
11) timeout - 時間量(以整數分鐘為單位),經過該時間量之後,Cookie 則會到期。預設值是 30。逾時屬性是一個可調值,從收到上次請求的時間開始計算,它將在 n 分鐘後到期。為了避免對效能產生負面影響,也為了避免那些開啟了 Cookie 警告的應用程式產生多個瀏覽器警告,Cookie 在逾時時間過半時更新。(這意味著在某些情況下可能會出現精度損失。) #p#分網頁標題#e#
2、使用者授權。
在asp.net 2.0程式中,我們可以通過對Web.config檔案進行配置,從而達到對存取權限的控制,配置方法如下:
<authorization>
<allow VERB="POST" users="2abcd@gmail.com" />
<allow roles="admin" />
<deny users="*" />
<allow VERB="GET" users="abc,xyz" />
<deny users="?" />
</authorization>
註:可以把授權使用者和角色設定的配置寫在某個檔案夾內,則所做的配置只作用於該檔案夾內,自動繼承外面的配置。
allow - 允許
deny - 拒絕
users - 使用者(多使用者用逗號隔開)
roles - 角色(多角色用逗號隔開)
verb - 指定http方法,post或get
* - 所有使用者
? - 匿名(未經過身分識別驗證的)使用者
我們還可以按路徑對角色授權:
<location path="folder">
<system.web>
<authorization>
<deny users="?"/>
<allow users="*"/>
</authorization>
</system.web>
</location>
<location path="abc.aspx">
<system.web>
<authorization>
<allow roles="Administrators" />
<deny users="*"/>
</authorization>
</system.web>
</location>
<location>元素的path屬性可以是檔案夾也可以是某一檔案
3、成員資格管理
Membership類和MembershipUser類是成員資格管理API中的重要成員。利用它們,我們能夠實現使用者的驗證、管理、資訊檢索等功能。但在使用它們之前,我們需要修改Web.config來對其進行配置。配置樣本:
<membership defaultProvider="SqlMembershipProvider">
<providers>
<clear/>
<add name="SqlMembershipProvider"
type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
connectionStringName="SqlConnectionString"
enablePasswordRetrieval="false"
enablePasswordReset="true"
requiresQuestionAndAnswer="false"
applicationName="/"
requiresUniqueEmail="false"
passwordFormat="Hashed"
maxInvalidPasswordAttempts="3"
minRequiredPasswordLength="3"
minRequiredNonalphanumericCharacters="0"
passwordAttemptWindow="10"
passwordAnswerAttemptLockoutDuration="15"
passwordStrengthRegularExpression="" />
</providers>
</membership>
enablePasswordRetrieval - 是否可以檢索使用者密碼(總是false)
enablePasswordReset - 是否允許使用者重設其密碼
requiresQuestionAndAnswer - 是否要求在建立使用者時提供密碼提示問題和答案#p#分網頁標題#e#
applicationName - 自訂成員資格提供者的應用程式的名稱
requiresUniqueEmail - 電子郵件地址是否必須是唯一的
passwordFormat - 儲存的密碼的格式
maxInvalidPasswordAttempts - 使用者回答密碼重設問題時允許失敗的次數
minRequiredPasswordLength - 密碼所要求的最小長度
minRequiredNonalphanumericCharacters - 有效密碼中必須包含的最少特殊字元數
passwordAttemptWindow - 連續未能正確回答密碼重設問題的次數進行跟蹤的時間長度(單位:分鐘)
passwordAnswerAttemptLockoutDuration - 使用者多次未能正確回答密碼提示問題後使用者帳戶的鎖定時間長度(單位:分鐘)
passwordStrengthRegularExpression - 用於驗證密碼的Regex
Membership類部分功能實現程式碼範例:
建立新使用者:
try{
Membership.CreateUser ("name", "password", "mail");
}
catch (MembershipCreateUserException e)
{
// 失敗
switch (e.StatusCode)
{
case MembershipCreateStatus.DuplicateUsername:
……;
case MembershipCreateStatus.DuplicateEmail:
……;
case MembershipCreateStatus.InvalidPassword:
……;
default:
……;
}
}
登入驗證:
if (Membership.ValidateUser (UserName.Text, Password.Text))
FormsAuthentication.RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
可以使用的方法:CreateUser(建立使用者) DeleteUser(刪除使用者) GeneratePassword(生產隨即密碼) GetAllUsers(得到使用者) GetUser(查看某個使用者) UpdateUser(修改使用者) ValidateUser(驗證是否成功)
MembershipUser類部分功能實現程式碼範例:
掛起登入許可權:
if (Membership.ValidateUser (UserName.Text, Password.Text)) {
MembershipUser user = Membership.GetUser (UserName.Text);
user.Comment = "0"; //記錄登入次數
RedirectFromLoginPage (UserName.Text, RememberMe.Checked);
}
else {
MembershipUser user = Membership.GetUser (UserName.Text);
if (user != null) {
string count = Convert.ToInt32 (user.Comment) + 1;
user.Comment = count.ToString ();
}
}
它的一些方法和屬性:
屬性:Comment CreationDate Email LastLoginDate LastPasswordChangedDate UserId UserName
方法: ChangePassword ChangePassword-QuestionAndAnswer GetPassword ResetPassword
4、角色管理
若要實現角色管理,必須首先對Web.config檔案中的<roleManager>配置節進行配置:
<roleManager defaultProvider="SqlRoleProvider"
enabled="true"
cacheRolesInCookie="true"
cookieName=".VS2005_Role"
cookieTimeout="30"
cookiePath="/"
cookieRequireSSL="false"
cookieSlidingExpiration="true"
cookieProtection="All">
<providers>
<add
name="SqlRoleProvider"
type="System.Web.Security.SqlRoleProvider"
connectionStringName="SqlConnectionString"
applicationName="/" />
</providers>
</roleManager>
cacheRolesInCookie :指定當驗證某個使用者是否在特定角色中時,先檢查 Cookie,然後使用角色提供者在資料來源中檢查角色列表。如果為 true,則緩衝目前使用者的 Cookie 中的角色名稱列表;否則為 false。 預設值為 false。 #p#分網頁標題#e#
cookieName:指定儲存角色名稱的 Cookie 的名稱。預設值為 ".ASPXROLES"。
cookiePath :角色名稱 Cookie 的路徑。 預設值為 "/"。
cookieProtection:指定 CookieProtection 枚舉值之一。預設值為 All 值。
cookieRequireSSL:指定角色名稱 Cookie 是否需要使用 SSL 來發送到伺服器。如果設定為 true,則角色名稱 Cookie 需要使用 SSL 來發送到伺服器。 預設值為 false。
cookieSlidingExpiration:指定是否將定期重設角色名稱 Cookie 的到期日期和時間。如果設定為 true,則 Cookie 的到期日期和時間最初將設定為當前日期和時間與 CookieTimeout 值(分鐘)的加和。當使用者繼續主動地使用 ASP.NET 應用程式時,Cookie 的到期日期和時間將在剩餘時間不足 CookieTimeout 值的一半時自動更新。有關更多資訊,請參見 Expires。預設值為 true。
cookieTimeout:角色名稱 Cookie 到期之前的時間(分鐘)。預設值為 "30"(分鐘)。
createPersistentCookie:指定角色名稱 Cookie 是否為工作階段 Cookie;即,該 Cookie 會在瀏覽器關閉時丟失。如果設定為 true,則角色名稱 Cookie 是可跨多個瀏覽器會話使用的持久性 Cookie。持久性 Cookie 的到期日期和時間設定為當前的日期和時間與 CookieTimeout 值(分鐘)的加和。預設值為 false。
defaultProvider:預設角色提供者的名稱。有關更多資訊,請參見 Provider。預設值為 "AspNetSqlRoleProvider"。
domain:指定角色名稱 Cookie 的 Domain 值。預設值為 HttpCookie 屬性預設值,該值為空白字串 ("")。
enabled:指定是否要啟用角色管理。如果設定為 true,則啟用角色管理。在 Machine.config 檔案中,預設值為 false。
maxCachedResults:指定緩衝在角色 Cookie 中的角色名稱的最大數目。預設值為 25。
角色管理的API包括很多類,例如:Roles、RolePrincipal、RoleManagerEventArgs、RoleManagerModule等,其中Roles類是最重要的也是最常用的。
Roles類常用的方法:AddUserToRole CreateRole DeleteRole GetRolesForUser(查看使用者角色) GetUsersInRole IsUserInRole RemoveUserFromRole
因為本節相關屬性、方法、事件眾多,所以這裡只能儘可能地把常用的東東擺出來,如果有不明白的地方請自行搜尋,google一下。
成員資格原始碼:
upload/2007_05/07051722446157.rar
角色管理原始碼:
upload/2007_05/07051722442920.rar
註:以上代碼取自《ASP.NET 2.0開發指南》一書,感謝原作者
下一節:登入系列控制項