我正在使用Application_PostAuthenticateRequest
文件(ASP.NET MVC)中的global.asax
方法实现自定义故障单系统。我想知道这种事情的开销是多少 - 因为它会在每个请求上反序列化一些信息。它生成一个大约1.8 kb的cookie,这是一吨 - 但这是一个比频繁的数据库旅行更好的选择吗?
实现自定义FormsAuthenticationTicket
系统似乎比基于User.Identity.Name
连续到数据库的往返更聪明。但我只是担心这种持续的反序列化非常具有抑制性。但它看起来像这样......
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie != null)
{
string encTicket = authCookie.Value;
if (!String.IsNullOrEmpty(encTicket))
{
// decrypt the ticket if possible.
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(encTicket);
var userData = Deserializer.Deserialize(ticket);
UserPrincipal principal = new UserPrincipal(userData);
HttpContext.Current.User = principal;
}
}
}
以下是UserData
中序列化为FormsAuthenticationTicket
的类。
[Serializable]
public class MembershipData
{
public string Email
{
get;
set;
}
public int Id
{
get;
set;
}
public string[] Roles
{
get;
set;
}
public int[] Ancillary
{
get;
set;
}
}
答案 0 :(得分:8)
我知道这个问题在这一点上有点陈旧,已经有了一个可接受的答案,但我想提出我的想法,以及我们目前如何使用类似的设置做事。
最初,我们正在经历与您相同的过程,并在Cookie中包含了相当多的用户数据。这个过程确实减少了我们的数据库访问,但最终我们遇到了一些错误,其中一些用户根本无法登录,而其他用户则无法登录。事实证明,由于我们的序列化数据,当cookie超过一定大小时,它会被静默删除。
我们当前的流程是一个双层缓存系统。我们将用户的数据库ID作为User.Identity.Name
存储在cookie中,然后在PostAuthenticateRequest上,我们尝试从本地ASP.net缓存中检索用户信息,然后回退到分布式Redis缓存。本地缓存在进程中并存储15秒(因此重复请求不需要通过线路连接到Redis)。 Redis缓存存储一天,并在更新时失效。如果这两个都未命中,我们将从SQL Server加载信息。
然后我们将该用户信息放入自定义IPrincipal中,一切都像魅力一样。在一个使用率相当高的网站上,这似乎对我们非常有用。
答案 1 :(得分:2)
我建议您测量性能,但我希望cookie方法比往返数据库更快。您还可以使用逗号分隔或一些特殊字符分隔的字符串来简化序列化并使其尽可能快。以下是我如何根据性能对不同的操作进行排名: