웹 호스팅 서비스에 최근에 게시 한 asp.net MVC 웹 사이트가 있습니다. 거의 모든 것이 훌륭하게 작동하며, msSQL 데이터베이스에서 얻은 정보는 페이지 등에 표시됩니다.하지만 한 가지 문제가 있습니다. 내 웹 사이트에 로그인하려고하면 작동하지 않습니다. 더 자세히 설명하기 전에 사용자 로그인을 인증하는 다음 코드를 살펴 봐야합니다.
public ActionResult Login()
{
return View();
}
[HttpPost, ValidateAntiForgeryToken]
public ActionResult Login(LoginModel model)
{
if (ModelState.IsValid)
{
if (Repository.AuthenticateLogin(model.Username, model.Password.GetHashCode().ToString()))
{
FormsAuthentication.SetAuthCookie(model.Username, false);
return RedirectToAction("Index", "Home");
}
else
{
TempData["WrongLogin"] = "The username or password you've entered is wrong. Please try again!";
return View(model);
}
}
else
{
return View(model);
}
}
그리고 위의 if 문에서 사용되는 AuthenticateLogin (문자열 사용자 이름, 문자열 암호) 메서드는 다음과 같습니다.
public static bool AuthenticateLogin(string username, string password)
{
using (var context = new SHultEntities())
{
return (from u in context.User
where u.Username == username && u.Password == password
select u).Any();
}
}
이제 알 수 있듯이 사용자를 인증하기 위해 데이터베이스의 사용자 테이블에있는 모든 사용자에 대해 입력 한 사용자 이름과 암호를 확인합니다. 일치하는 경우 메서드는 "true"를 반환하고 그렇지 않으면 "false"를 반환합니다. 그래, 알았다.
음, 문제는 내 사이트에 로그인하려고 할 때 TempData [ "WrongLogin"] 텍스트가 표시된다는 것입니다. 즉, AuthenticateLogin 메서드가 false를 반환했음을 의미합니다. 즉 일치 항목이 없어야합니다. 그러나 동일한 사용자 이름과 암호를 사용하여 내 컴퓨터의 로컬 프로젝트에서이 작업을 시도하면 AuthenticateLogin이 true를 반환합니다.
문제가 데이터베이스에 연결 되었다면 데이터베이스에서 검색 한 헤더와 내용이 사이트에 나타나지 않습니다. 하지만 그렇습니다. 또한 로컬 프로젝트에서 무언가를 업데이트 한 다음 내 웹 사이트를 방문하면 업데이트 된 정보가 나타납니다. 그래서 유일한 문제는 내가 로그인 할 수 없다는 것입니다.
이것은 나를 미치게 만들며 나는 정말로 도움이 될 것입니다.
편집하다:콘텐츠 / 정보를 편집하기 위해 내 웹 사이트에 로그인해야한다는 것을 언급 할 가치가 있습니다. 그래서 로컬 프로젝트에 로그인하여 변경할 수 있다고 말한 다음 변경 사항이 웹 사이트에 표시됩니다.
문제가 생겼습니다.나는 암호를 해시하지 않은 사용자를 생성하고 암호에서 AuthenticateLogin에서 .GetHashCode.ToString ()을 삭제했다. 그런 다음 나는 다시 출판했다. 그것은 작동합니다. 문제는 해싱입니다.
이 문제를 어떻게 해결할 수 있습니까? db에 해시 된 암호가 필요합니다 ...
데이터베이스에 사용자 이름과 암호를 어떻게 분류 했습니까? password.GetHashCode ()의 구현이 특정 머신 특정 (즉, 특정 머신 솔트에 의존하는 경우) 이는 모든 사용자와 일치 할 수없는 이유 일 수 있습니다. 반면에 사용자가 원격 (호스트) 환경을 통해 생성 된 경우 문제가되지 않습니다.
문제는 내 해싱 때문이었습니다. Apprenatly, 똑같이 보이는 두 개의 문자열은 표준 프레임 워크 구현으로 해시 할 때 다른 값을 생성 할 수 있습니다..GetHashCode (), 다른 컴퓨터에 (심지어 기계가 프레임 워크의 동일한 버전을 사용하고 있더라도).
자세한 내용은,여기를 클릭하십시오!
나는 사용자 정의 해싱 클래스를 사용하여 내 문제를 해결했다.