2012-03-08 4 views
1

Я написал следующий код для входа в мое приложение с использованием C# и LINQ. Он связан с SQL-ориентированной базой данных, созданной в Visual Studio. Проблема, с которой я сталкиваюсь, - это тот, который я не понимаю, и надеюсь, что кто-то может мне помочь. Я создал два сообщения в коробке, чтобы попытаться увидеть вывод моего кода. Я ничего не получаю от него.Login Form trouble

Если бы кто-нибудь мог помочь, это было бы здорово!

public bool UserLogin(string User, string Pass) 
{ 
    var Database = new ExampleDataSet(); 

    var query = from Employee in Database.Employee 
     where (Employee.EmployeeID.ToString() == Employee.ToLower() && Employee.Password == Pass) 
     select Employee; 

    if (query.Count() != 0) 
    { 
     return true; 
     MessageBox.Show("You are logged in"); 
    } 

    return false; 
    MessageBox.Show("You are not logged in"); 
} 

private void cmdLogin_Click(object sender, EventArgs e) 
{ 
    string User = (txtUser.Text); 
    string Pass = (txtPass.Text); 
    UserLogin(User, Pass); 
} 
+0

Возможно, попробуйте инкапсулировать пароль в кавычки? Если вы отлаживаете отправку тех же значений, которые находятся в базе данных? – Gage

ответ

0

Если вы имеете в виду пользователь = EmployeeID

Employee.EmployeeID.ToString() == user.ToLower() 

если нет:

Employee.EmployeeName.ToLower() == user.ToLower() 

О окне сообщения, вы должны знать, какие-либо заявления после return не будет выполнена

+1

Вопрос в том, почему он не получает никаких результатов от своих MessageBoxes, хотя ... –

2

Когда вы вернетесь, выполнение функции остановится, потому что оно выполнено и вернет значение к тому, что оно как называется. Так что ничего после вашего возвращения не произойдет. Попробуйте положить MessageBox.Show перед тем return:

MessageBox.Show("You are logged in"); 
return true; 

И то же самое для ложной версии.

1

Коды сообщений не отображаются, поскольку они после операторов возврата - переместите свои окна сообщений до возврата, чтобы увидеть их.

3

Из кода, который вы написали, кажется, что проблема в том, что вы сравниваете строковое представление Employee с его EmployeeId имуществом Employee.EmployeeID.ToString() == Employee.ToLower(). Эта строка всегда будет возвращать false, если вы не переоцените метод ToString() класса Employee, чтобы вернуть свойство EmployeeId (что, я полагаю, вы этого не сделали). Попробуйте это вместо того, чтобы (при условии, что параметр User содержит имя пользователя):

using(var dataSet = new ExampleDataSet()) 
{ 
    var loggedIn = dataSet.Employee.Any(e=>e.UserName == User && e.Password == Pass); 
    var message = loggedIn ? "You are logged in" : "You are not logged in"; 
    MessageBox.Show(message); 
    return loggedIn; 
} 
+0

Идентификатор пользователя будет именем пользователя. Я фактически удалил ToLower и изменил тип данных на Int, но я все еще продолжаю получать сообщение о том, что я не вошел в систему. –

+0

Попробуйте открыть профилировщик Sql Server, чтобы увидеть точный SQL-запрос, выполняемый с базой данных, и проверить параметр запроса значения для значений базы данных. – RePierre

1

Я сделал изменения в вашем коде .... Ваша если-то еще часть не действует ...... Вы являются сопоставимыми employee.ID с самим сотрудником. Прочтите следующий код .....

  public bool UserLogin(string User, string Pass) 
      { 

       var Database = new ExampleDataSet(); 

       var query = from Employee in Database.Employee 
          where (Employee.EmployeeID.ToString().ToLower().Equals(User.ToLower())&& Employee.Password.ToString().ToLower().Equals(Pass.ToLower()) 
          select Employee; 

       if (query.Count() != 0) 
       { 
        MessageBox.Show("You are logged in"); 
        return true; 
       } 
       else 
       { 
        MessageBox.Show("You are not logged in"); 
        return false; 
       } 



      } 

      private void cmdLogin_Click(object sender, EventArgs e) 
      { 
      string User = (txtUser.Text); 
      string Pass = (txtPass.Text); 
      UserLogin(User, Pass); 
      } 
+0

EmployeeID фактически представлен как Целое число в базе данных. Я попытался изменить код, чтобы представить это, и я продолжаю получать сообщение о том, что пользователь не вошел в систему. –

0

Написание собственной аутентификации пользователя не рекомендуется. Это очень сложно сделать правильно, и в большинстве случаев вы можете использовать тот, который уже предоставляется Windows или сетью dot net.

Например, ваше приложение не должно хранить пароли пользователей в виде простого текста. Если ваше приложение или база данных скомпрометированы, злоумышленник получит не только полный доступ к вашему приложению, но и список паролей, которые, скорее всего, пользователи также использовали в других местах.

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

Чтобы проверить пароль, вы просматриваете соль в базе данных, добавляете к ней пароль, хеш-результат и затем сравниваете его с сохраненным значением. Если они совпадают, пользователь вводит правильный пароль.

Если вы пишете приложение, которое будет использоваться в домене Windows, вы можете использовать группы Active Directory для управления доступом к вашему приложению. На простейшем уровне вы можете сохранить приложение в папке, доступной только авторизованным пользователям.

Вы также можете использовать группы для управления доступом к базе данных, к которой подключается приложение. Если вы используете SQL-сервер, каждая группа должна быть помещена в роль базы данных SQL, которая, в свою очередь, предоставляет необходимые разрешения для этой роли.

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

Если вы пишете приложение ASP.Net, рассмотрите возможность использования MemberShip и ролей, которые встроены в структуру.