【问题标题】:System.InvalidOperationException: The LINQ expression.... 'could not be translated. Asp.Net 6 ...Translation of method 'DecodeFrom64' failedSystem.InvalidOperationException:LINQ 表达式....\'无法翻译。 Asp.Net 6 ...方法\'DecodeFrom64\'的翻译失败
【发布时间】:2022-12-05 21:15:13
【问题描述】:

在 ASP.NET Core-6 Web API 项目中,我试图在将密码与输入的密码进行比较之前从数据库中检索和解码密码。

我有这段代码:

public async Task<User> GetUser(string email, string password)
{
     return await _context.Set<User>().Where(e => e.Email == email
                    && DecodeFrom64(e.Password) == password).FirstOrDefaultAsync();
}

我收到此错误:

System.InvalidOperationException: The LINQ expression 'DbSet<User>()
    .Where(u => u.Email == __email_0 && 
DbHelper.DecodeFrom64(u.Password) == __password_1)'
could not be translated. Additional information: 
Translation of method 'UserOnboardingApi.Model.DbHelper.DecodeFrom64' > failed.

我该如何解决这个问题?

谢谢

期望从数据库中检索和解码密码并与用户输入的密码进行比较

【问题讨论】:

  • EF 将 LINQ 查询转换为 SQL。它不能转换本地函数调用。此外,密码需要加盐和散列具有强大的密码功能的时代。 ASP.NET Identity 对密码进行 10K 次哈希处理,尽管当前指南是使用 300K 次迭代
  • 什么是DecodeFrom64?该错误告诉您无法将其翻译成目标查询语言(在本例中可能是 T-SQL)。
  • 只需添加.ToList()return await _context.Set&lt;User&gt;().ToList().Where(e =&gt; e.Email == email &amp;&amp; DecodeFrom64(e.Password) == password).FirstOrDefaultAsync();
  • @RomanRyzhiy:到处喷洒.ToList()作为神奇的解决方案会导致其他问题。总是具体化整个数据库表任何查询的代码都无法很好地扩展。
  • @RomanRyzhiy 这是一个严重的问题,不是just add ToList()。在最好的情况下,这只会掩盖错误的查询问题并导致性能不佳。在这种情况下,这是等待发生的数据泄露

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


【解决方案1】:

EF 对您的方法一无所知 DecodeFrom64 并且无法将其转换为 SQL。选项是编码密码并在服务器端检查它:

public async Task<User> GetUser(string email, string password)
{
     return await _context.Set<User>().Where(e => e.Email == email
                    && e.Password == YourEncodeMethod(password)).FirstOrDefaultAsync();
}

或者只是通过电子邮件获取用户(我想它应该是唯一的)并在客户端检查密码。

【讨论】:

    猜你喜欢
    • 2022-10-20
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 2022-12-03
    • 1970-01-01
    • 2021-11-27
    • 1970-01-01
    相关资源
    最近更新 更多