3

登录

[HttpPost]
public ActionResult Login(LoginModel loginModel)
{
    if (ModelState.IsValid)
    {
        using (var _Db = new AccountContext())
        {
            var _UserAccount = _Db.UserAccounts.FirstOrDefault(u => u.Username == loginModel.Username && u.Password == loginModel.Password);

            if (_UserAccount == null)
            {
                ModelState.AddModelError("", "Account doesn't exist!");
            }
            else
            {
                FormsAuthentication.SetAuthCookie(loginModel.Username, false);
            }
        }
    }
    return RedirectToAction("Index", "Home");
}

重定向或显示视图

public ActionResult Index()
{
    if (HttpContext.User.Identity.IsAuthenticated)
    {
        return View("Index");
    }
    else
    {
        return RedirectToAction("LoginPage");
    }
}

我已经逐步完成了代码,可以看到使用正确的用户名调用了 SetAuthCookie。 FormsAuthentication.SetAuthCookie(loginModel.Username, false);

什么会阻止用户通过身份验证?

4

3 回答 3

7

什么会阻止用户通过身份验证?

一个可能的原因是如果您忘记在 web.config 中启用表单身份验证:

<system.web>
    <authentication mode="Forms">
      <forms loginUrl="~/Account/Login" timeout="2880" />
    </authentication>
    ...
</system.web>

您可能还想在调用 SetAuthCookie 方法后检查是否在浏览器中发出了表单身份验证 cookie。默认情况下,此 cookie 将被调用.ASPXAUTH。如果此类 cookie 存在且票证尚未过期,则该HttpContext.User.Identity.IsAuthenticated方法将返回 true。

于 2013-05-09T21:23:38.987 回答
4

我遇到了同样的问题,即使在将<authentication mode="Forms">标签添加到我的 web.config 文件后仍然存在。当我在那里时,我注意到:

<system.webServer> <modules> <remove name="FormsAuthentication" /> </modules> </system.webServer>

我参考了另一个 MVC 项目 web.config 文件并看到了不同之处:

<system.webServer> <modules> <remove name="FormsAuthenticationModule" /> </modules> </system.webServer>

我将值更改为 read <remove name="FormsAuthenticationModule" />,瞧!- 现在可以了。抱歉,我不明白为什么,或者那里发生了什么,但我希望可以帮助其他人。

于 2014-12-15T18:30:04.440 回答
0

您需要先对用户进行身份验证:

WebSecurity.Login(loginModel.UserName, loginModel.Password);

只有在那之后,您才能设置身份验证 cookie。

于 2013-05-09T21:17:12.277 回答