PostAuthenticateRequest的开销是多少?

Cie*_*iel 7 c# performance forms-authentication asp.net-mvc-3

我正在使用Application_PostAuthenticateRequest我的global.asax文件(ASP.NET MVC)中的方法实现自定义票证系统.我想知道这种事情的开销是多少 - 因为它会在每个请求上反序列化一些信息.它生成一个大约1.8 kb的cookie,这是一吨 - 但这是一个比频繁的数据库旅行更好的选择吗?

信息被反序列化

  • 用户ID(int)
  • 角色(字符串[])
  • 电邮(字符串)
  • 关联的ID(int [])//(很难描述这些是什么,但每个用户将有大约3个)

实现自定义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;
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这里是正在连载的类UserDataFormsAuthenticationTicket.

[Serializable]
public class MembershipData
{
    public string Email
    {
        get;
        set;
    }

    public int Id
    {
        get;
        set;
    }

    public string[] Roles
    {
        get;
        set;
    }

    public int[] Ancillary
    {
        get;
        set;
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ner 8

我知道这个问题在这一点上有点陈旧,已经有了一个可接受的答案,但我想提出我的想法,以及我们目前如何使用类似的设置做事.

最初,我们正在经历与您相同的过程,并在cookie中包含了相当多的用户数据.这个过程确实减少了我们的数据库访问,但最终我们遇到了一些错误,其中一些用户根本无法登录,而其他用户则无法登录.事实证明,由于我们的序列化数据,当cookie超过一定大小时,它会被静默删除.

我们当前的流程是一个双层缓存系统.我们将用户的数据库ID存储在cookie中User.Identity.Name,然后在PostAuthenticateRequest上,我们尝试从本地ASP.net缓存中检索用户信息,然后回退到分布式Redis缓存.本地缓存在进程中并存储15秒(因此重复请求不需要通过线路连接到Redis).Redis缓存存储一天,并在更新时失效.如果这两个都是未命中的,我们然后从SQL Server加载信息.

然后,我们将该用户信息放入自定义IPrincipal中,一切都像魅力一样.在一个使用率相当高的网站上,这对我们来说似乎很有效.


Dar*_*rov 2

我建议您测量性能,但我希望 cookie 方法比往返数据库更快。您还可以通过使用逗号分隔或某些特殊字符分隔的字符串来简化序列化并使其尽可能快。以下是我对不同操作的性能排名的方式:

  1. 进程内通信
  2. 进程间通信
  3. 网络间通讯