0

我有以下负责登录身份验证的方法:

 [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel loginModel, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            //if (Membership.ValidateUser(loginModel.UserName, loginModel.Password))
            var session = RMWebClientBL.Sessions.Login(loginModel.UserName, loginModel.Password);
            if(session != null && !session.IsFailed && session.SessionId != Guid.Empty)
            {
                SetAuthCookie(loginModel, session);
                RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View();
    }

    private void SetAuthCookie(LoginModel loginModel, DomainObjects.Sessions.SessionDetails session)
    {
        // create encryption cookie         
        FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1,
                loginModel.UserName,
                DateTime.Now,
                //TODO: make it configurable!!!!
                DateTime.Now.AddMinutes(20),
                loginModel.RememberMe,
                session.SessionId.ToString());

        // add cookie to response stream         
        string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
        System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
        if (authTicket.IsPersistent)
        {
            authCookie.Expires = authTicket.Expiration;
        }
        System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);  
    }

    private ActionResult RedirectToLocal(string returnUrl)
    {
        if (Url.IsLocalUrl(returnUrl))
        {

           return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

但是,当我在设置 cookie 后尝试登录时,“User.Identity.IsAuthenticated”仍然为假,但似乎我已登录,因为如果我点击我们的徽标将我重定向到主页,我已通过身份验证。为什么我登录后无法重定向?

4

3 回答 3

2

找到解决方案毕竟是一件愚蠢的事情:问题出在以下方法上:

  public ActionResult Login(LoginModel loginModel, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            //if (Membership.ValidateUser(loginModel.UserName, loginModel.Password))
            var session = RMWebClientBL.Sessions.Login(loginModel.UserName, loginModel.Password);
            if(session != null && !session.IsFailed && session.SessionId != Guid.Empty)
            {
                SetAuthCookie(loginModel, session);
                return RedirectToLocal(returnUrl);
            }
            else
            {
                ModelState.AddModelError("", "The user name or password provided is incorrect.");
            }
        }

        // If we got this far, something failed, redisplay form
        return View();
    }

如您所见,我已将“返回”添加到

return RedirectToLocal(returnUrl);

问题是缺少“return”关键字,所以我总是到最后一行:

return View();

这样我总是回到我的登录页面,而不是处理正确的页面。

于 2012-12-06T11:19:08.373 回答
0

仅仅看一下,您似乎并没有使用 .NET 中包含的标准 MembershipProvider,因为正是这个提供程序设置了 IsAuthenticated 标志。看来您使用自己的提供程序,但仅使用 FormsAuthenticationTicket 部分。

于 2012-12-06T10:42:57.790 回答
0

尝试使用以下方法而不是加密并创建您自己的 cookie。

  FormsAuthentication.SetAuthCookie(userAuth, model.RememberMe);

该方法不仅加密票证,而且还创建一个 cookie,将其添加到响应和幕后的其他一些事情中。我在我的项目中使用它,它工作得很好。

于 2012-12-06T11:02:50.527 回答