登入視窗已經完成了,現在可以完成最後的工作了,主要就是完成Membership提供者的配置。
首先開啟Web.Config檔案,在configuration段內添加一個資料庫連接定義,代碼如下:
<connectionStrings>
<addname="ApplicationServices"connectionString="Data Source=192.168.0.254;InitialCatalog=SimpleCMS;Persist Security Info=True;User ID=sa;password=abcd-1234;"providerName="System.Data.SqlClient" />
</connectionStrings>
代碼中的資料庫地址、使用者名稱和密碼請根據自己實際情況填寫。
然後在system.web段內添加Membership提供者的定義,代碼如下:
<membership>
<providers>
<clear />
<add name="AspNetSqlMembershipProvider"type="System.Web.Security.SqlMembershipProvider"connectionStringName="ApplicationServices"enablePasswordRetrieval="false" enablePasswordReset="true"requiresQuestionAndAnswer="false"requiresUniqueEmail="true" maxInvalidPasswordAttempts="5"minRequiredPasswordLength="6"minRequiredNonalphanumericCharacters="0"passwordAttemptWindow="10" applicationName="/" />
</providers>
</membership>
<roleManager enabled="true">
<providers>
<clear />
<add name="AspNetSqlRoleProvider"type="System.Web.Security.SqlRoleProvider"connectionStringName="ApplicationServices"applicationName="/" />
<add name="AspNetWindowsTokenRoleProvider"type="System.Web.Security.WindowsTokenRoleProvider"applicationName="/" />
</providers>
</roleManager>
代碼中,membership段是用來定義Membership提供者的,定義的內容包括,類型(type)為SQLMembershipProvider,表示使用的是SQL Server提供者;資料庫的連接字串(connectionStringName)為剛才定義的連接字串;密碼恢複(enablePasswordRetrieval)為fallse;重設密碼(enablePasswordReset)為true;要求密碼問題(requiresQuestionAndAnswer)為false;要求唯一電子郵件(requiresUniqueEmail)為true;最大的密碼錯誤嘗試次數(maxInvalidPasswordAttempts)為5次;密碼最小長度(minRequiredPasswordLength)為6;密碼最小的非字元個數(minRequiredNonalphanumericCharacters)為0;有效密碼或密碼答案的連續失敗嘗試次數進行跟蹤的時間間隔(passwordAttemptWindow)為10分鐘。最後的applicationName,表示當前應用程式的標識,因為沒有多個應用程式使用該資料庫提供者,因而設定為“/”。
而roleManager段定義的角色提供者,主要定義就是連接字串和應用程式的標識。
完成後,在主菜單中選擇項目,ASP.NET配置,會在瀏覽器中開啟13所示網站管理工具。如果剛才的配置正確,現在就可以添加使用者和角色了。
圖13 網站管理工具
單擊頁面中的安全性標籤頁,將看到14的頁面。
圖14 安全性標籤頁
單擊角色中的“建立或管理角色”,在15所示的頁面中,先建立系統管理員和普通使用者兩種角色。
圖15 建立角色
返回安全性標籤頁,單擊使用者中的“建立使用者”建立admin和test兩個使用者。兩個使用者的密碼都設定為123456,電子郵件隨便填吧。還要將admin的角色設定為系統管理員,test的角色設定為普通使用者。
好了,使用者和角色都有了,可以完成最終的驗證代碼了。回到VS,切換到AccountController.cs檔案,先加入對System.Web.Security的引用,然後修改驗證使用者和密碼的判斷語句,並加上寫入認證Cookies的代碼,最終代碼如下:
if(Membership.ValidateUser(model.UserName,model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, true);
success = true;
}
else
{
errors.Add("UserName", "錯誤的使用者名稱或密碼。");
errors.Add("Password", "錯誤的使用者名稱或密碼。");
}
好了,簡單驗證過程就完成了,不過,貌似太簡單了點,呵呵。下面搞得複雜點。先把這段語句屏蔽掉,調用Membership的GetUser方法根據使用者名稱傳回型別為MembershipUser使用者物件,代碼如下:
MembershipUser user = Membership.GetUser(model.UserName);
接著判斷user是否為null,如果為null,表示使用者不存在,返回使用者名稱和密碼錯誤資訊,代碼如下:
if (user != null)
{
}
else
{
errors.Add("UserName", "錯誤的使用者名稱或密碼。");
errors.Add("Password", "錯誤的使用者名稱或密碼。");
}
如果使用者不為null,表示使用者存在。接著檢查使用者IsApproved屬性,看使用者是否被禁用了,如果是,返回使用者被禁用資訊,代碼如下:
if (user.IsApproved)
{
}
else
{
errors.Add("UserName", "使用者已被禁用,請與管理員聯絡。");
}
接著檢查IsLockedOut屬性,判斷使用者是否已被鎖定,如果鎖定,返回使用者被鎖定資訊,還需要多少分鐘解鎖,代碼如下:
TimeSpan ts = user.LastLockoutDate.AddMinutes(60) -DateTime.Now;
if (user.IsLockedOut && ts.Minutes > 0)
{
errors.Add("UserName", "使用者名稱已被鎖定," + ts.Minutes + "分鐘後才能再次嘗試登入。");
}
else
{
if (user.IsLockedOut)user.UnlockUser();
}
代碼中的LastLockoutDate屬性會返回使用者被鎖定的時間,通過AddMinutes方法,加上鎖定時間間隔,當前是60分鐘,就可計算出解鎖時間,將解鎖時間減去目前時間,就可根據它們的差值ts判斷是否已經過瞭解鎖時間了。如果ts大於0,表示還沒達到解鎖時間,否則就意味著已經解鎖,可以繼續驗證了,因而,要調用UnlockUser方法來解鎖使用者。
接著就可調用ValidateUser方法驗證使用者名稱和密碼了,也就是把剛才屏蔽掉的那段代碼複製到這裡。
在驗證成功後,還要驗證使用者的角色是否符合登入背景要求,目前只運行系統管理員和普通使用者登入,因而驗證成功後的代碼要修改成這樣:
if (Roles.IsUserInRole(model.UserName, "系統管理員 ") |Roles.IsUserInRole(model.UserName, "普通使用者"))
{
FormsAuthentication.SetAuthCookie(model.UserName, false);
success =true;
}
else
{
errors.Add("UserName", "您沒有許可權登入系統。");
}
至此,整個登入過程就完成了。