2015-03-15 4 views
-1

У меня есть страница, которая является страницей входа. Я хочу аутентифицировать пользователя, используя адрес электронной почты или номер телефона в разделе Username.Аутентификация по электронной почте или номеру телефона

Я использую следующий метод:

public Customer Authenticate(string uname, string pass) 
     { 
      string query = "select * from tblCustomer where ([email protected] OR [email protected]) and [email protected] "; 

      List<SqlParameter> lstP = new List<SqlParameter>(); 

      lstP.Add(new SqlParameter("@uname", uname)); 
      lstP.Add(new SqlParameter("@pass", pass)); 

      DataTable dt = DBUtility.SelectData(query, lstP); 

      if (dt.Rows.Count == 0) 
      { 
       return new Customer(); 
      } 
      else 
      { 
       return SelectByID(Convert.ToInt32(dt.Rows[0]["CustomerID"])); 
      } 
     } 

Теперь в этом методе, как добавить 3-ий параметр ?? то есть phone number?

Любые идеи, как мне это сделать? P.S .: Я использую 3-уровневую архитектуру

Далее следует код для SelectData упаковывают необходимого:

public static DataTable SelectData(string query, List<SqlParameter> lstParams) 
     { 
      SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|MyDB.mdf;Integrated Security=True"); 

      SqlCommand comm = new SqlCommand(query, conn); 
      comm.Parameters.AddRange(lstParams.ToArray()); 

      SqlDataAdapter adapter = new SqlDataAdapter(comm); 
      DataTable dt = new DataTable(); 
      conn.Open(); 
      adapter.Fill(dt); 
      conn.Close(); 

      return dt; 
     } 
+0

Я мог бы это сделать, но тогда мне пришлось бы добавить еще один параметр к параметру 'method's':' Authenticate (string uname, string pass) 'и я вхожу ** только один **' Username' .. Тогда как мне передать 3 параметра? –

+0

@AbhishekGhosh: Если вход содержит одно значение ('uname'), а в базе данных есть один столбец, связанный с этим значением (' Username'), то почему вам нужно добавить еще одно в первую очередь? Зачем вам сравнивать один и тот же столбец с одним и тем же значением ввода дважды? – David

+0

У меня есть столбец с именем 'Username', который я хочу пройти аутентификацию в полях' Email' или 'Phone' в базе данных. –

ответ

2

Вы не имеют третий параметр. У вас есть только эти:

Если это значение uname может быть либо адрес электронной почты или номер телефона, а в таблице у вас есть Username колонки, то вы бы матч против этой колонки:

select * from tblCustomer where [email protected] and [email protected] 

Не имеет значения, какое интуитивное содержимое содержит это поле, будь то электронная почта или номер телефона. Поле - это строка. Любая уникальная строка может быть именем пользователя.


С другой стороны, если таблица базы данных имеет два отдельные поля (Email и Phone, например), то вы можете просто добавить два параметра запроса:

select * from tblCustomer where ([email protected] OR [email protected]) and [email protected] 

И добавить такое же значение, как параметры:

lstP.Add(new SqlParameter("@email", uname)); 
lstP.Add(new SqlParameter("@phone", uname)); 

С другой стороны, если пользователи ввода значение в отдельные поля и у вас есть отдельные значения, поступающие в метод:

string email, string phone, string pass 

Затем вы можете использовать те, в запросе:

select * from tblCustomer where ([email protected] OR [email protected]) and [email protected] 

и добавить отдельные значения в качестве параметров:

lstP.Add(new SqlParameter("@email", email)); 
lstP.Add(new SqlParameter("@phone", phone)); 

Дело в том, что все, что вам нужно сделать, это передать значения в запрос. Структура того, как вы обрабатываете значения, не изменяет, являются ли они адресом электронной почты или номером телефона. Оба являются строками и семантически неотличимы от кода.


Примечание: Пожалуйста, убедитесь, что вы правильно хэширования паролей пользователей. Этот код предлагает (но не обязательно гарантирует), что вы можете хранить пароли пользователей в виде простого текста. Это может быть абсолютно безответственно вашим пользователям. Пожалуйста, используйте хеш-пароли, чтобы их исходный текст не мог быть восстановлен.

+0

Спасибо @ Давид. Второй случай был тем, который мне нужен. Разъяснилось красиво! –