我的 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?
或者如果不是登录方法,还有哪里是创建用户上下文的好地方?
我想要实现的是:
- 用户登录
- 如果登录成功,请查询 db 以获取他的角色/权限并将它们保存到会话中,这样我每次检查用户是否有权访问某个操作时都不必重新查询。