控制項
ASP.NET 2.0提供了一套強大的身分識別驗證體系,並且伴隨一套登入控制項的推出,使得ASP.NET 2.0開發人員在做使用者註冊-登入驗證功能模組時大大降低了開發費時。
但是我們發現在使用Login登入控制項時我們只能使用它的FailureText 屬性擷取或設定當登入嘗試失敗時顯示的文本,當登入嘗試失敗時向使用者顯示的文本,預設為“您的登入嘗試失敗,請重試。”
但是在使用ASP.NET 2.0的Membership體系時可能產生登入失敗的情況不僅僅是使用者名稱/密碼不正確而產生的,也能由於帳戶被鎖定了(MembershipUser.IsLockedOut=True)或是程式需要帳戶不能進行資格驗證(比如註冊使用者需要審核才能正式開通,一般使用MembershipUser.IsApproved=False)又或者自己擴充了一些其他的附屬Profile驗證失敗……但是,使用Login登入失敗時,預設卻只能顯示我們設定的FailureText的內容。當然,出於安全性的考慮MS並不推薦您把具體的登入失敗的資訊顯示給使用者,例如,像“使用者 <username> 的密碼無效”這樣的錯誤資訊向潛在的攻擊者透漏了 <username> 是系統的使用者這一情況。
不過,有時我們還是希望能在帳戶被鎖定時顯示“您的帳戶被鎖定”,在為審核時顯示“您的帳戶正在審核中……”,那麼要怎麼顯示給使用者呢?一種最簡單的辦法是在Login.LoginError 事件中做處理。
比如:
protected void Login1_LoginError(object sender, EventArgs e)
{
Login l = (Login)sender;
MembershipUser u = Membership.GetUser(l.UserName);
if (!u.IsApproved)
{
l.FailureText = "帳戶證在審核中";
return;
}
if (u.IsLockedOut)
{
l.FailureText = "您的帳戶已經被鎖定";
return;
}
// 預設錯誤訊息提示
l.FailureText = "您的登入嘗試失敗,請重試。";
}
當然,您可以通過重載等更進階的方法來實現這一功能。