gpt4 book ai didi

c# - PostAuthenticateRequest 的开销是多少?

转载 作者:太空狗 更新时间:2023-10-29 20:11:40 25 4
gpt4 key购买 nike

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

正在反序列化的信息

  • 用户 ID(整数)
  • 角色(字符串[])
  • 电子邮件(字符串)
  • Associated Ids (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;
}
}
}

这是 FormsAuthenticationTicket 中被序列化为 UserData 的类。

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

public int Id
{
get;
set;
}

public string[] Roles
{
get;
set;
}

public int[] Ancillary
{
get;
set;
}
}

最佳答案

我知道这个问题在这一点上有点陈旧并且已经有一个公认的答案,但我想谈谈我的想法以及我们目前如何使用类似的设置来做事。

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

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

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

关于c# - PostAuthenticateRequest 的开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4949172/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com