1

我的 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 以获取他的角色/权限并将它们保存到会话中,这样我每次检查用户是否有权访问某个操作时都不必重新查询。
4

1 回答 1

0

您可以执行以下操作:

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

于 2012-11-08T10:23:20.500 回答