2013-07-01 66 views
0

我有一個ASP.NET Web應用程序,Web.config文件設置爲啓用鎖定:maxInvalidPasswordAttempts="8"ASP.NET SQL成員資格檢查使用循環失敗登錄嘗試

但是,我不想簡單地鎖定用戶,我想在嘗試4次後顯示一條消息,表明帳戶在X次額外失敗嘗試後將被鎖定。

示例:假設用戶有4次失敗嘗試;他們會看到一條消息,警告該帳戶將被鎖定(我不想指定總嘗試次數),只會導致帳戶鎖定過多失敗。

8次失敗嘗試後,用戶會收到一條消息,指出該帳戶已被鎖定。

要做到這一點,我決定使用While Loop,所以我創建了這樣的循環: 我通常創建一個草稿,如果代碼工作,然後將其添加到我的項目。

我已經有登錄和其他一切工作,只是這個循環。如果我能找到循環出錯的地方,那麼我可以執行所有數據庫檢查並鎖定帳戶。

if (Membership.ValidateUser(txtUserName.Text, txtPassword.Text)) 
    { 
    FormsAuthentication.RedirectFromLoginPage(txtUserName.Text, chkMemory.Checked); 
    } 
    else 
    { 
     ltrStatusMsg.Text = "* InValid Login"; 
    } 

問題是此代碼在控制檯應用程序中工作,但是當我嘗試將它寫入按鈕事件時失敗。

static void Main(string[] args) 
    { 
     int loginAttempts = 0; 
     int maxLoginAttempt = 8; 

     while (loginAttempts < maxLoginAttempt) 
     { 
      Console.Write("Enter a number: "); 
      Console.ReadLine(); 

      if (loginAttempts == 3) 
      { 
       loginAttempts++; 

       Console.Write("Lock Warning :"); 
      } 

      loginAttempts++; 
     } 

     Console.Write("Account Locked: "); 
     Console.ReadKey(); 
    } 

例:按鈕事件: *注:我已經多次改變了這種代碼,找出我的問題*

protected void btnSubmit_Click(object sender, EventArgs e) 
     { 
      int loginAttempts = 0; 
      int maxLoginAttempt = 8; 

     while (loginAttempts < maxLoginAttempt & txtPassword.Text != "Test") 
     { 
      if (loginAttempts == 3) 
      { 
       loginAttempts++; 

       ltrStatusMsg.Text = "Lock Warning"; 
      } 

      loginAttempts++; 
     } 

     ltrStatusMsg.Text = "Account Locked"; 
    } 
+0

我認爲在回發的變量值是intilized回零。使用斷點來檢查 – Karthik

+0

我們可以通過指定當前登錄在誘惑會話的價值,並通過條件。循環不是必需的... –

+0

我不得不從數據庫中檢索?這聽起來像個好主意,因爲無論如何我已經在檢查數據庫以驗證用戶登錄。 – Asynchronous

回答

1

嘗試這樣的....

protected ovoid Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
    Session["mloginAttempts"] = 0; 
    Session["maxLoginAttempt"] = 8; 
    } 
} 
protected void btnSubmit_Click(object sender, EventArgs e) 
{ 
    int mLoginAttempt = Convert.ToInt32(Session["mloginAttempts"]); 
    int maxLoginAttempt = Convert.ToInt32(Session["maxLoginAttempt"]); 

    if(loginAttempts < maxLoginAttempt & txtPassword.Text != "Test") 
    { 
    if (loginAttempts == 3) 
    { 
     Session["mloginAttempts"] = Convert.ToInt32(Session["mloginAttempts"]) + 1; 
     ltrStatusMsg.Text = "Lock Warning"; 
    } 
    Session["mloginAttempts"] = Convert.ToInt32(Session["mloginAttempts"]) + 1; 
    } 
    else 
    { 
    ltrStatusMsg.Text = "Account Locked"; 
    } 
} 
+0

Anna P.這個作品非常漂亮。非常感謝你,會議做到了。但是,我想我只是直接從數據庫中獲取值,因爲我已經爲每次登錄嘗試進行了數據庫調用。 SQL Server成員資格將失敗的嘗試值存儲在aspnet_Membership表中,該表中我寫了一個Method來獲取。但上面的解決方案是我可以保留在我的工具箱中的東西。思考? – Asynchronous

+0

偉大的....通過編碼保持搖擺.... –

+0

直到我垂死的一天! :) – Asynchronous