将其发布到 Web 托管服务后无法登录到我的 mvc 站点

Can't login to my mvc site after publishing it to a Web hosting service

我最近在网络托管服务上发布了一个 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-statement 中使用的方法“AuthenticateLogin(string username, string password) 如下所示:

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();
        }
    }

现在,如您所见,为了对用户进行身份验证,我正在根据数据库 user-table 中的任何用户检查输入的用户名和密码。如果匹配,方法 returns "true",否则它 returns "false"。是的,你明白了。

嗯,问题是,当我尝试登录我的站点时,我得到了 TempData["WrongLogin"] 文本,这意味着我的 AuthenticateLogin 方法一定返回了 false,这意味着一定没有有过任何比赛。但是当我在我的计算机上的本地项目上尝试使用相同的用户名和密码时,AuthenticateLogin returns 为真。

如果问题出在与数据库的连接上,headers 和我从数据库中检索到的内容将不会出现在网站上。但确实如此。此外,当我从我的本地项目更新某些内容然后访问我的网站时,会出现更新的信息。所以,唯一的问题是我无法登录。

这让我发疯,非常感谢您的帮助。

编辑: 值得一提的是,我必须登录我的网站才能编辑任何 content/information。这就是为什么我提到我可以从我的本地项目登录并更改,然后更改会出现在网站上。

发现问题: 我尝试使用 non-hashed 密码创建一个用户,并从密码的 AuthenticateLogin 中删除了 .GetHashCode.ToString() 。然后我re-published。有用。问题是散列。

我该如何解决这个问题?我需要数据库中的散列密码...

您是如何在数据库中输入用户名和密码的?如果 password.GetHashCode() 的实现是特定于机器的(即依赖于特定于机器的盐),那么这可能就是它无法与任何用户匹配的原因。另一方面,如果用户是通过远程(托管)环境创建的,这应该不是问题。

问题是我的散列引起的。显然,两个看起来完全相同的字符串在散列时可能会产生不同的值,标准框架实现 .GetHashCode(),在不同的机器上(即使机器使用相同版本的框架)。

更多信息,click here!

我使用自定义哈希解决了我的问题-class。