2012-03-08 11 views
1

C#とLINQを使用してアプリケーションにログインするためのコードを書きました。 Visual Studioで作成したSQLサービス指向のデータベースに接続します。私が抱えている問題は、私が理解していないもので、誰かが私をここで助けてくれることを願っています。私はそれから何も得ていない私のコードの購入の出力を見てみるために箱入りの2つのメッセージを作成しました。ログインフォームの問題

誰かがそれが偉大なことを助けることができたら!

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

ない場合は、ユーザー=社員

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

を意味する場合は、次のメッセージボックスについて

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

return

+1

質問は彼が彼のMessageBoxesからの出力を得ない理由であるようです... –

2

を実行されませんした後、あなたが任意のステートメントを知っておくべきは、戻りますと、関数の実行は終了し、値はその値に戻りますから呼ばれた。あなたの復帰後のことは何も起こりません。 returnMessageBox.Showを入れてみてください:

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

と偽バージョンも同じ。

1

メッセージボックスはそのまま表示されませんの後に - メッセージボックスを返す前にメッセージボックスを移動して表示します。

3

あなたが書いたコードから、Employeeの文字列表現とそのEmployeeIdのプロパティEmployee.EmployeeID.ToString() == Employee.ToLower()を比較しているようです。この行は、メソッドのEmployeeクラスをオーバーライドしてプロパティEmployeeIdを返さない限り、常にfalseを返します(私はあなたがしなかったと推測しています)。 (そのパラメータを想定し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

ユーザーIDはユーザー名になります。私は実際にToLowerを削除し、データ型をIntに変更しましたが、まだログオンしていないというメッセージが表示され続けます。 –

+0

SQL Serverプロファイラを開き、データベースに対して実行された正確なSQLクエリを表示して、データベース値に対する値。 – RePierre

1

....あなたのif-elseの部分は有効ではありません......あなたは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は実際にはデータベースのIntegerとして表されます。これを表すコードを変更しようとしましたが、ユーザーがログインしていないというメッセージが表示され続けます。 –

0

独自のユーザー認証を書くことはお勧めしません。それを正しく行うことは非常に難しく、ほとんどの場合、既にWindowsまたはドットネットフレームワークによって提供されているものを使用することができます。

たとえば、アプリケーションではユーザーのパスワードをプレーンテキストで保存しないでください。アプリケーションやデータベースが侵害された場合、攻撃者はアプリケーションに完全にアクセスするだけでなく、他の場所でも使用している可能性の高いパスワードのリストを取得します。

ユーザーの資格情報を保存する必要がある場合は、最初に塩漬けし、次に安全なハッシュアルゴリズムでハッシュする必要があります。これにより、データベースにアクセスして誰かがユーザーのパスワードを学習するのを防ぐことができます。

パスワードを確認するには、データベースで塩を検索し、パスワードを追加して結果をハッシュし、保存された値と比較します。それらが同じ場合、ユーザーは正しいパスワードを入力しました。

Windowsドメインで使用されるアプリケーションを作成する場合、Active Directoryグループを使用してアプリケーションへのアクセスを制御できます。最も簡単なレベルでは、許可されたユーザーのみがアクセスできるフォルダにアプリケーションを格納できます。

グループを使用して、アプリケーションが接続するデータベースへのアクセスを制御することもできます。 SQL Serverを使用している場合は、各グループをSQLデータベースロールに配置し、そのロールに必要な権限を与えます。

アプリケーション内から、ユーザーグループのメンバーシップを参照して、表示するフォーム/メニューオプションを決定したり、承認されていないアプリケーションを終了したりすることができます。

ASP.Netアプリケーションを作成する場合は、フレームワークに組み込まれているMemberShipとロールの使用を検討してください。

関連する問題