如何在ASP.NET Core Web API中实现邮箱大小写不敏感登录
修复邮箱大小写敏感的登录问题
由于无法修改数据库的大小写设置,我们可以在代码层面统一邮箱格式,确保无论用户输入何种大小写形式,都能匹配到数据库中存储的全小写邮箱:
具体修改方案
- 在查询用户前,将用户输入的邮箱转换为全小写格式,保证查询条件与数据库存储格式一致
- 若密码哈希过程依赖邮箱(你的
VerifyHashedPassword方法传入了email参数),验证密码时也要使用转换后的小写邮箱,避免哈希验证失败
修改后的代码
public async Task<User> Login(string? email, string? password) { if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(email)) { throw new ClientError("Email and password required."); } // 统一转换为小写并去除前后空白 var normalizedEmail = email.Trim().ToLowerInvariant(); var user = await ValidateUser(normalizedEmail, password); return user ?? throw new ClientError("Invalid email or password."); } private async Task<User?> ValidateUser(string normalizedEmail, string password) { // 使用统一格式的邮箱查询用户 var user = await _queries .GetByEmail(normalizedEmail) .FirstOrDefaultAsync(); if (user == null) { return null; // Email does not exist. } // 验证密码时传入统一后的邮箱(匹配哈希逻辑的输入格式) var passwordIsCorrect = _hashUtil.VerifyHashedPassword( email: normalizedEmail, password: password, hash: user.Password ); if (passwordIsCorrect) { return user; } return null; }
细节说明
- 使用
ToLowerInvariant()而非ToLower(),避免因系统区域设置差异导致的大小写转换错误 - 先调用
Trim()去除邮箱前后空白,避免用户输入带空格的邮箱导致查询失败
内容的提问来源于stack exchange,提问作者Convert.ToInt32
相关产品推荐
相关产品推荐

