【发布时间】: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<User>().ToList().Where(e => e.Email == email && DecodeFrom64(e.Password) == password).FirstOrDefaultAsync(); -
@RomanRyzhiy:到处喷洒
.ToList()作为神奇的解决方案会导致其他问题。总是具体化整个数据库表任何查询的代码都无法很好地扩展。 -
@RomanRyzhiy 这是一个严重的问题,不是
just add ToList()。在最好的情况下,这只会掩盖错误的查询问题并导致性能不佳。在这种情况下,这是等待发生的数据泄露
标签: c# asp.net entity-framework asp.net-core asp.net-web-api