我的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?
或者,如果不是登录方法,那么在哪里创建用户上下文的好地方?
我想要实现的目标是:
答案 0 :(得分:0)
您可以执行以下操作:
当用户首次登录时,获取用户的角色/权限详细信息,序列化并将其存储在会话中。因此,当此会话在内存中时,每次要检查用户是否具有操作权限时,都要从内存中反序列化该操作,而不是转到数据库。