可以在Login方法中使用User.Identity.IsAuthenticated返回true吗?

时间:2012-11-08 10:13:37

标签: c# asp.net-mvc forms-authentication

我的MVC项目中有以下登录方法

    public ActionResult Login(LoginModel model, string returnUrl)
    {


        if (ModelState.IsValid)
        {


            if (_authenticationRepository.Login(model.UserName, model.Password))
            {                    
                var authenticationTicket = new FormsAuthenticationTicket(1, model.UserName, DateTime.Now,
                                                                         DateTime.Now.AddMinutes(20),
                                                                         model.RememberMe, "", "/");

                var cookie = new HttpCookie(FormsAuthentication.FormsCookieName,
                                                FormsAuthentication.Encrypt(authenticationTicket));
                Response.Cookies.Add(cookie);
                UserContext.CreateUserContext();
                return RedirectToLocal(returnUrl);
            }
        }

UserContext.cs 这会将用户/权限存储到会话中。

    public static void CreateUserContext()
    {
        BuildUserContext(HttpContext.Current.User);
    }

    private static void BuildUserContext(IPrincipal principalUser)
    {
        if (!principalUser.Identity.IsAuthenticated) return;

        var user = _userAccountsRepository.GetUserByUserName(principalUser.Identity.Name);

        if (user == null) return;

        var userContext = new UserContext { IsAuthenticated = true };

        var siteUser = Mapper.Map(user);

        userContext.SiteUser = siteUser;

        HttpContext.Current.Session["UserContext"] = userContext;
    }

我知道IsAuthenticated只有在重定向后才会变为真。所以在我的login()方法中,是否可以确保principalUser.Identity.IsAuthenticated将返回true?

或者,如果不是登录方法,那么在哪里创建用户上下文的好地方?

我想要实现的目标是:

  1. 用户登录
  2. 如果登录成功,请查询db以获取其角色/权限并将其保存到会话中,以便每次我检查用户是否有权访问某个操作时都不必重新查询。

1 个答案:

答案 0 :(得分:0)

您可以执行以下操作:

当用户首次登录时,获取用户的角色/权限详细信息,序列化并将其存储在会话中。因此,当此会话在内存中时,每次要检查用户是否具有操作权限时,都要从内存中反序列化该操作,而不是转到数据库。