我正试图修复我的应用程序中的一个错误,此时用于登录的用户电子邮件是大小写敏感的,当它应该是大小写不敏感的。
我使用以下代码在MVC中做到这一点:
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _userManager.Find(model.UserName, model.Password);
if (user != null)
{
SignIn(user, model.RememberMe);
return RedirectToAction("List", "Survey");
}
ModelState.AddModelError("LoginFailure", "Invalid username or password.");
}
return View(model);
}
_userManager
是一个UserManager
,覆盖了标准的AspNet标识UserManager
。这似乎使用了区分大小写的比较
我已经研究了许多解决这个问题的方法,包括在输入所有用户名时将其小写或大写并更改数据库以匹配的明显方法,但我宁愿在不编辑数据库的情况下解决这个问题。我已经尝试过使用lambda表达式,但不幸的是,这些表达式似乎不适用于Find方法。
我的用户名列在数据库中有它的排序为SQL_Latin1_General_CP1_CI_AS
,我相信它使比较不区分大小写。
我已经看了一段时间了,现在找不到任何人抱怨完全相同的问题,除了这个人在这个链接。
我将非常感谢任何帮助与这个问题,不涉及数据库操作,甚至确认,如果这是唯一可能的方法。谢谢你。
感谢Sam Farajpour Ghamari的评论,我能够找到UserStore
的findUserByName
方法的覆盖并更改此代码:
public User GetByUsername(string username)
{
return GetAll().FirstOrDefault(u => u.UserName == username);
}
:
public User GetByUsername(string username)
{
return GetAll().FirstOrDefault(u => u.UserName.ToLower() == username.ToLower());
}
它起作用了。谢谢你的帮助。
希望我的代码对大家有帮助
public class Users
{
[Key]
public int Id { get; set; }
[Required]
public string Username { get; set; }
[Required]
[DataType(DataType.Password)]
public string Password { get; set; }
}
这是我的控制器
public ActionResult Login(Users model)
{
using (var db = new YourDBContext())
{
//check if database for username
var accountCheck = db.Users.FirstOrDefault(u => u.Username == model.Username);
if (model.Username != null && accountCheck != null)
{
var userPass = db.Users.Where(u => u.Username == model.Username).Select(u => u.Password);
//Materializes the query into a readable list of array objects
var materializePass = userPass.ToList();
//Since query will only result to one , we ony have one array of result
var password = materializePass[0];
//Check username and password (Case Sensitive)
if (accountCheck.Username == model.Username && model.Password == password )
{
//Your code here to redirect
}
}
}
}