I've discovered that using hashed passwords with salts is much better idea than MD5/SHA256 so I'm not hashing them with PBKDF2. However I'm wondering if this is correct approach to authorize my user. I also have logic for logging authorizations and when same IP did wrong login/pass it is banned for 5 minutes.
- Administrator a is passing
usernameandpassword - Checking if
usernameexists - Checking if password is correct for this user
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Authorize(Administrator a)
{
// Check if there are no failed login attempts in last 5 minutes
if (!this.CanAdminLogin)
{
TempData["loginTooManyAttempts"] = true;
return RedirectToAction("index", "home");
}
// If model is not validated return login view to show error messages (javascript disabled)
if (!TryValidateModel(a))
{
return View("Authorize", a);
}
// Check if username exists, if not then log and show that login failed
var admin = _db.Administrators.Where(x => x.Username == a.Username).SingleOrDefault();
if (admin == null || admin.Username != a.Username)
{
this.LogAuthorization(a, false);
TempData["loginFailed"] = true;
return RedirectToAction("index", "home");
}
// Username exists, check if passwords match
ICryptoService cryptoService = new PBKDF2();
string hash = cryptoService.Compute(a.Password, admin.PasswordSalt);
if (hash == admin.Password)
{
this.LogAuthorization(a, true);
Session["adminId"] = admin.ID;
}
else
{
this.LogAuthorization(a, false);
TempData["loginFailed"] = true;
}
// Login successfull
return RedirectToAction("index", "home");
}