【问题标题】:How to use custom Methods in LINQ Query如何在 LINQ 查询中使用自定义方法
【发布时间】:2021-06-27 05:58:01
【问题描述】:

我有以下问题:我目前正在开发 ASP .net 核心实体框架后端,并且遇到需要在 LINQ 查询中使用自定义方法并在执行此操作时出现错误的问题。一世 研究并发现可以编写自定义函数,将其翻译为sql,但我认为这样做的范围不大。 (例如:SQL 将无法使用库和哈希字符串)。

我听说的另一种方法是将我的数据库转换为 Enumberale,然后在其上应用我的自定义方法,这种方法有效,但性能不佳,因为我将整个数据库保存在我的内存中,这变得非常有大量数据时速度很慢。所以我的问题是,是否有在 LINQ 查询中执行自定义方法的高性能解决方案?

我的详细问题是,我已经将我的加盐密码保存在我的数据库中,当有人想要登录他的帐户时,我必须将数据库中的密码与盐 + 用户密码输入进行比较,这必须在我的 where 子句中进行哈希处理。如果我不使用盐,它会起作用,因为那时我只需要对用户输入进行哈希处理,这不是数据库的列。

【问题讨论】:

  • 您应该从数据库中获取盐和哈希密码,然后在代码中对用户输入进行哈希处理并与现有哈希进行比较。无需向数据库发送复杂的代码。也可能是散列故意不具有防止暴力攻击的性能。
  • 在数据库中运行存储过程进行检查。您使用的是什么类型的数据库?
  • madoxdev 的回答涵盖了它:为什么要在 Linq 查询中计算类似哈希的东西?在存储像密码这样的哈希值时,您将 Salt 和哈希值保存到数据库记录中。您确实存储未加密的值,然后尝试在查询中散列等式的两端或类似的东西。
  • 请看我的回答。 @jdweng 我使用 MySQL 作为数据库。

标签: c# entity-framework linq asp.net-web-api entity-framework-core


【解决方案1】:

你应该做的是 - 在后端计算哈希和盐,并在你的 WHERE 语句中使用计算的哈希。在这种情况下,您不需要从 SQL 中调用您的方法,也不需要将整个数据库(或表)拉入内存来计算哈希。

由于我不知道您的代码,因此伪代码方法是:

    var user = service.GetUserByEmail(email);
if (user == null) {
//Invalid User
}
    var hash = ComputeHash(user.Salt, inputPwd);
    
 if(user.PasswordHash == hash) {
//User is logged in
} else {
//Invalid Password or email
}

【讨论】:

  • 我知道要做什么,但是当我尝试散列当前的 salt + 用户在 where 子句中输入密码时出现错误,因为 LINQ 会在 SQL 中翻译它。
  • var 结果 = _context.Users。 .Where(e => (e.UserMail.ToUpper().Equals(data.Mail.ToUpper()) && e.UserPasswort.Equals((CreateHash(e.UserSalt + data.Password))))) .FirstOrDefault( );
  • 请看我的代码,我从数据库中获取整个用户,然后不在上下文中进行哈希计算(只为该用户传递数据),然后我比较我计算的是否是等于保存到数据库中的内容。当您尝试在 Cotext 上执行所有这些操作时,这是行不通的要求
  • 好的,谢谢你的解决方案,我的方法不是最好的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-04
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多