我有一个asp.net MVC网站,我最近在网络托管服务上发布。几乎所有东西都很好用,我从msSQL db获得的信息显示在页面等等上。但是有一个问题。当我尝试登录我的网站时,它将无法正常工作。在我进一步解释之前,您将需要查看以下代码,即我对用户登录进行身份验证的方式:
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。
如果问题是与数据库的连接,我从数据库中检索的标题和内容将不会出现在网站上。但确实如此。此外,当我从本地项目更新某些内容然后访问我的网站时,会显示更新的信息。所以,唯一的问题是我无法登录。
这让我发疯,我真的很感激一些帮助。
编辑:值得一提的是,我必须登录我的网站编辑任何内容/信息。这就是为什么我提到我可以登录并更改我的本地项目,然后更改出现在网站上。
FOUND PROBLEM:我尝试使用非哈希密码创建用户,并从密码的AuthenticateLogin中删除.GetHashCode.ToString()。然后我重新发表。有用。问题是散列。
我该如何解决这个问题?我需要db中的哈希密码...
答案 0 :(得分:2)
您是如何在数据库中播种用户名和密码的?如果password.GetHashCode()的实现是特定于机器的(即依赖于机器特定的盐),那么这可能是它无法与任何用户匹配的原因。另一方面,如果用户是通过远程(托管)环境创建的,这应该不是问题。
答案 1 :(得分:0)
问题是由我的哈希造成的。 Apprenatly,两个看起来完全相同的字符串在散列时可以产生不同的值,在不同的机器上使用 .GetHashCode()的标准框架实现(即使机器使用相同版本的框架) 。
有关详细信息,请click here!
我通过使用自定义的哈希类解决了我的问题。