.net 从ClaimsPrincipal和UserManager获取值之间的区别是什么,哪一个更快?

vngu2lb8  于 2023-06-25  发布在  .NET
关注(0)|答案(1)|浏览(139)

我下面有这些扩展方法,2个来自ClaimsPrincipal,一个来自UserManager,都是提取电子邮件。
有什么区别,哪个更快?(即不需要太多的时间从数据库中获取,或者根本不从数据库中获取,或者它们都从数据库中获取?

var email = HttpContext.User.GetUserEmail();

public static string GetUserEmail(this ClaimsPrincipal user) {
  return user.FindFirst(ClaimTypes.Email)?.Value;
}
var email = HttpContext.User.RetrieveEmailFromPrincipal();

public static string RetrieveEmailFromPrincipal(this ClaimsPrincipal user) {
  return user?.Claims?.FirstOrDefault(x => x.Type == ClaimTypes.Email)?.Value;
}
var ca = await _userManager.Users
    .Where(p => p.Id == d)
    .Select(p => p.Email)
.FirstOrDefaultAsync();
q8l4jmvw

q8l4jmvw1#

GetUserEmail()RetrieveEmailFromPrincipal()ClaimsPrincipal对象的扩展方法。他们正在从索赔中检索用户的电子邮件地址。如果你检查FindFirst()的实现,你会发现它使用与FirstOrDefault()相同的foreach循环进行迭代。两者之间的差异主要是风格上的,在表现上没有显著差异。
这两种方法的时间复杂度非常相似。它们都必须扫描用户的声明列表,直到找到所需类型的声明。
第三种方法使用实体框架从数据库中检索用户的电子邮件地址。
通常,ClaimsPrincipal上的扩展方法会更快,因为声明已经在内存中(在身份验证过程中检索),不需要往返数据库。但是,它们要求电子邮件声明已经添加到用户的声明中,这可能并不总是这样,这取决于应用程序的设置方式。
有关获取用户数据How to get the current logged in user ID in ASP.NET Core?的详细信息,请阅读本文

相关问题