2012-04-27 2 views
-1

Я выглядит UserManager model.It как:asp.net MVC 3 условие всегда возвращает ложь

public class UserManager 
{ 
    private ToLetDBEntities TLE = new ToLetDBEntities(); 
    public string GetUserPassword(string usermail) 
    { 
     var user = from o in TLE.users where o.email_add == usermail select o; 
     if (user.ToList().Count > 0) 
     { 
      return user.First().password; 

     } 
     else 
      return string.Empty; 
    } 
} 

и У меня есть AccountController как:

public class AccountController : Controller 
{ 
    [HttpPost] 
    public ActionResult LogOn(UserLogOn model) 
    { 
     if (ModelState.IsValid) 
     { 
      UserManager um = new UserManager(); 
      string pass = um.GetUserPassword(model.email_add); 

      if (model.password==pass) 
      { 
       FormsAuthentication.SetAuthCookie(model.email_add, false); 
       return RedirectToAction("Welcome", "Home"); 
      } 
      else 
      { 
       ModelState.AddModelError("", "The provided password is incorrect."); 

      } 

     } 

     return View(model); 
    } 
} 

и я Модель UserLogon содержит (email_add, пароль). Когда я запускаю этот контроллер, он всегда дает мне сообщение об ошибке «Предоставленный пароль неверен». if (model.password == pass) это условие всегда дает false. пожалуйста, помогите мне. Спасибо в Advance ..

+0

Ваш пароль хранится от GetUserPassword() хэшируются или шифруются? – Tuan

+1

Вам нужно сделать простую отладку ... т. Е. В GetUserPassword, пользователь == null или он возвращается с пользователем ... если пользователь возвращается - какова его ценность для свойства пароля? – Charlino

+0

пароль - это просто тип nchar в базе данных. Я проверяю, что возвращаемый пароль не является нулевым или пустым. –

ответ

2

Вам нужно сделать простую отладку.

I.e.

  • в GetUserPassword, пользователь == null или он возвращается с пользователем?
  • если пользователь возвращается - какова его ценность для свойства пароля?

UPDATE: Из комментариев

Поскольку вы используете NCHAR (15) в качестве типа столбца базы данных, строк, которая поступает из базы данных будут проложены с дополнительным белым пространством.

Вы могли бы решить проблему путем обрезки пароля при возврате его - вот так:

return user.First().password.Trim(); 

Но лучше исправить было бы использовать NVARCHAR для типа столбца базы данных, а затем вы бы не иметь проблема пробелов в пробелах.

БОНУС: В методе GetUserPassword вы дважды перечисляете коллекцию IQueryable user - это приведет к двум вызовам БД.

Изменить его на что-то вроде этого, чтобы избежать этого:

public class UserManager 
{ 
    private ToLetDBEntities TLE = new ToLetDBEntities(); 
    public string GetUserPassword(string usermail) 
    { 
     var user = TLE.users.FirstOrDefault(x => x.email_add == usermail); 
     if (user != null) 
     { 
      return user.password; 

     } 
     else 
      return string.Empty; 
    } 
} 
+0

его не работает .. –

+0

Я также пробовал это в UserManager: string pass = um.GetUserPassword(model.email_add); if (pass == null || pass.Length == 0) { return RedirectToAction("Welcome", "Home"); } он дает ту же ошибку. –

+0

См. Мое обновление. Кроме того, вместо выполнения 'if (pass == null || pass.Length == 0)' вы могли бы сделать 'if (string.IsNullOrWhitespace (pass))' – Charlino

Смежные вопросы