我正在尝试设置一个 .NET MVC 3 项目来存储自定义用户会话对象(以后可以在其他后续操作中从自定义主体对象访问该对象)我已按照此处的步骤操作: ASP.NET MVC - 设置自定义 IIdentity或 IPrincipal (LukeP 所说的 - 我也需要自定义会员资格等)
在我的登录操作中,我有这样的事情:
if (provider.ValidateUser(model.UserName, model.Password))
{
// setup principal
JavaScriptSerializer serializer = new JavaScriptSerializer();
string userData = serializer.Serialize(provider.GetSession());
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
model.UserName,
DateTime.Now,
DateTime.Now.AddMinutes(15),
false,
userData);
string encTicket = FormsAuthentication.Encrypt(authTicket);
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket);
Response.Cookies.Add(faCookie);
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
它将基本上获取用户对象(provider.GetSession() 从外部身份验证服务返回自定义用户会话对象),然后将其存储在 FormsAuthenticationTicket
问题是来自外部服务的用户会话对象超过 4Kb(大约 7Kb 已加密),并且由于大小,cookie 没有存储在浏览器中。
有没有其他安全的方法可以将此用户会话对象存储在某处,所以我不必继续查询数据库?我听说将它存储在 Session 中是不安全的(因为会话劫持 - 并且它与成员资格分离。) - 那么我还有什么其他选择?
我无法减小自定义用户会话对象的大小——这不是一个选项,因为它的属性依赖于所有系统层调用。
问候,马丁