Вы можете использовать куки-файл FormsAuthentication для хранения вашей пользовательской информации и предотвращения постоянного доступа к базе данных. Этот файл cookie зашифрован, и любая информация, которую вы храните, так же безопасна, как и сам пользовательский сеанс. Единственная проблема с файлами cookie заключается в том, что они имеют максимальный размер 4 КБ, поэтому, если ваша пользовательская информация огромна, вы можете столкнуться с проблемой. Когда я использую подход cookie, я сохраняю свои пользовательские данные в виде JSON, а затем десериализую этот JSON при каждом запросе страницы. Вот моя логика контроллера входа (я использую SimpleMembership, но подход тот же:
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, model.RememberMe))
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null)
{
var user = _userLogic.GetItem(model.UserName);
if (user != null && user.IsActive)
{
var newAuthTicket = new FormsAuthenticationTicket(authTicket.Version, authTicket.Name, authTicket.IssueDate, authTicket.Expiration, authTicket.IsPersistent, JsonConvert.SerializeObject(user));
var newCookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(newAuthTicket))
{
Expires = authCookie.Expires
};
Response.Cookies.Add(newCookie);
return RedirectToLocal(returnUrl);
}
WebSecurity.Logout();
ModelState.AddModelError("UserName", "This account has been deactivated.");
return View(model);
}
}
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
Обратите внимание на создание newAuthTicket и на то, как экземпляр пользователя передается ему в виде JSON. После этого все, что мне нужно сделать, это десериализовать этот пользовательский объект в методе OnAuthorization моего базового контроллера:
protected override void OnAuthorization(AuthorizationContext filterContext)
{
var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
var authTicket = FormsAuthentication.Decrypt(authCookie.Value);
if (authTicket != null)
{
var principal = new CustomPrincipal(HttpContext.User.Identity)
{
CurrentUserInfo = JsonConvert.DeserializeObject<User>(authTicket.UserData)
};
HttpContext.User = principal;
AppUser = principal.CurrentUserInfo;
ViewBag.AppUser = AppUser;
}
}
base.OnAuthorization(filterContext);
}