ASP.NET Core 6 Web API中LINQ无法解析DecodeFrom64方法报错求助
问题解决方法
问题根源
EF Core无法将自定义的DecodeFrom64方法转换为数据库可执行的SQL语句,直接在LINQ的Where条件中调用该方法会触发翻译失败的异常。
解决方案
临时修复(适配当前需求)
先通过Email查询将用户数据拉取到内存,再在本地执行解码和密码比对:
public async Task<User> GetUser(string email, string password) { // 仅通过Email查询用户,EF Core可正常转换为SQL var user = await _context.Set<User>().FirstOrDefaultAsync(e => e.Email == email); if (user == null) return null; // 在内存中解码密码并比对 var decodedDbPassword = DbHelper.DecodeFrom64(user.Password); return decodedDbPassword == password ? user : null; }
安全最佳实践(强烈推荐)
Base64是编码而非加密,存储可解码的密码存在严重安全风险。正确的做法是存储密码的哈希值,验证时将用户输入的密码哈希后与数据库中的哈希值比对:
- 存储密码时:
using Microsoft.AspNetCore.Identity; // 实例化PasswordHasher var passwordHasher = new PasswordHasher<User>(); // 对原始密码进行哈希后存储 user.Password = passwordHasher.HashPassword(user, rawPassword); await _context.SaveChangesAsync();
- 验证密码时:
using Microsoft.AspNetCore.Identity; public async Task<User> ValidateUser(string email, string password) { var user = await _context.Set<User>().FirstOrDefaultAsync(e => e.Email == email); if (user == null) return null; var passwordHasher = new PasswordHasher<User>(); // 验证输入密码与哈希值是否匹配 var verificationResult = passwordHasher.VerifyHashedPassword(user, user.Password, password); return verificationResult == PasswordVerificationResult.Success ? user : null; }
内容的提问来源于stack exchange,提问作者step ofori
相关产品推荐
相关产品推荐

