我已經可以減少數據庫中的AttemptsLeft
設置爲5
。如果我用正確的用戶名輸入密碼錯誤,AttemptsLeft
將減少1。如果用戶的狀態是Suspended
,我也已經可以讓用戶不登錄系統。鎖定用戶,如果失敗5次嘗試
問題:
我定當AttemptsLeft
被降低到0,則用戶的狀態將成爲Suspended
。但是,數據庫中的AttemptsLeft
總是會減少,並且用戶的狀態將不會變爲Suspended
,但如果我正確輸入用戶名和密碼,則會得到Suspended
,無論有多少個AttemptsLeft
左派。
什麼可能是錯的?
我想從數據庫中檢索user.Attempts
不工作,那是因爲user.Attempts
永遠0
,只有在數據庫中AttemptsLeft
將被降低,因爲我被query
減少它。
這裏是我使用的代碼:
的UserManager類:
public void GetAttempts(string Username, string Password)
{
LoginContext context = new LoginContext();
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "SELECT [Username], [Password], [AttemptsLeft] FROM [Information] WHERE [Username] = @Username AND [Password] = @Password";
conn.Open();
using (SqlCommand cmd = new SqlCommand(query, conn))
{
cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
cmd.Parameters["@Username"].Value = Username;
cmd.Parameters.Add("@Password", SqlDbType.NVarChar);
cmd.Parameters["@Password"].Value = Password;
using (SqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
context.Attempts = Convert.ToInt32(reader["AttemptsLeft"]);
}
}
}
conn.Close();
}
}
public bool CheckUser(string Username, string Password)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
_query = "SELECT [Username], [Password] FROM [Information] WHERE [Username] = @Username AND [Password] = @Password";
conn.Open();
using (SqlCommand cmd = new SqlCommand(_query, conn))
{
cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
cmd.Parameters["@Username"].Value = Username;
cmd.Parameters.Add("@Password", SqlDbType.NVarChar);
cmd.Parameters["@Password"].Value = Password;
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
return true;
}
else
{
return false;
}
}
}
}
}
public bool CheckStatus(string Username, string Password)
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
_query = "SELECT [Username], [CurrentStatus] FROM [Information] WHERE [Username] = @Username AND [CurrentStatus] = @CurrentStatus";
conn.Open();
using (SqlCommand cmd = new SqlCommand(_query, conn))
{
cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
cmd.Parameters["@Username"].Value = Username;
cmd.Parameters.Add("@CurrentStatus", SqlDbType.NVarChar);
cmd.Parameters["@CurrentStatus"].Value = "Active";
using (SqlDataReader reader = cmd.ExecuteReader())
{
if (reader.HasRows)
{
return true;
}
else
{
return false;
}
}
}
}
}
public bool SuspendUser(string Username)
{
bool flag = false;
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "SELECT [Username], [CurrentStatus] FROM [Information] WHERE [Username] = @Username";
string _query = "UPDATE [Information] SET [CurrentStatus] = @CurrentStatus WHERE [Username] = @Username";
conn.Open();
using (SqlCommand cmd = new SqlCommand(query, conn))
using (SqlCommand _cmd = new SqlCommand(_query, conn))
{
cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
cmd.Parameters["@Username"].Value = Username;
_cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
_cmd.Parameters["@Username"].Value = Username;
_cmd.Parameters.Add("@CurrentStatus", SqlDbType.NVarChar);
_cmd.Parameters["@CurrentStatus"].Value = "Suspended";
flag = Convert.ToBoolean(_cmd.ExecuteNonQuery());
}
conn.Close();
}
return flag;
}
public bool DecreaseAttempts(string Username)
{
bool flag = false;
using (SqlConnection conn = new SqlConnection(connectionString))
{
string query = "SELECT [Username], [AttemptsLeft] FROM [Information] WHERE [Username] = @Username";
string _query = "UPDATE [Information] SET [AttemptsLeft] = [AttemptsLeft] - 1 WHERE [Username] = @Username";
conn.Open();
using (SqlCommand cmd = new SqlCommand(query, conn))
using (SqlCommand _cmd = new SqlCommand(_query, conn))
{
cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
cmd.Parameters["@Username"].Value = Username;
_cmd.Parameters.Add("@Username", SqlDbType.NVarChar);
_cmd.Parameters["@Username"].Value = Username;
flag = Convert.ToBoolean(_cmd.ExecuteNonQuery());
}
conn.Close();
}
return flag;
}
LoginContext的型號:
public int Attempts
{
get;
set;
}
控制器:
UserManager manager = new UserManager();
[HttpGet]
public ActionResult Login()
{
return View();
}
[HttpPost]
public ActionResult Login(LoginContext user, string Username, string Password)
{
if (!Request.IsAuthenticated)
{
if (ModelState.IsValid)
{
// `if` statement below will gets executed when I enter the password and username correctly.
if (manager.CheckUser(Username, Password))
{
// `if` statement below will gets executed when user's status is not `Suspended`
if (manager.CheckStatus(Username, Password))
{
manager.GetAttempts(Username, Password);
// `if` statement below will not gets executed. It is like `user.Attempts` always be `0`.
if (user.Attempts > 0)
{
FormsAuthentication.SetAuthCookie(user.Username, false);
return RedirectToAction("List", "Home");
}
//`else` statement below will gets executed whenever I enter the username and password correctly.
else
{
ModelState.AddModelError(string.Empty, "The account: " + Username + ", has been locked due too many failed login attempts!");
manager.SuspendUser(Username);
}
}
//`else` statement below will gets executed when user's status is `Suspended`.
else
{
ModelState.AddModelError(string.Empty, "Your account has been locked due too many failed login attempts!");
}
}
// `else` statement below will gets executed when I enter the password wrongly and username correctly or vice versa.
else
{
ModelState.AddModelError(string.Empty, "Username or password incorrect!");
manager.DecreaseAttempts(Username);
}
}
return View(user);
}
}
或者您可以使用內置的aspnet_Membership提供程序,爲您完成所有這些工作。 –
GetAttempts()創建並填充局部變量,然後永遠不會返回它,所以,我不確定你想在那裏完成什麼。 –
@JK:我試圖不依賴於「ASP.Net Membership」並試圖讓它自己完成。 :p – Stainn