2012-05-05 21 views
0

誰かがコードから何か問題を教えてもらえますか?VB.NET - ASP.NET - 不正なユーザー名/パスワード(検証)

ユーザ名とパスワードが一致しない場合、lblテキストに「不正なユーザ名/パスワード」が表示されるはずです。

コード:

Protected Sub btnLogin_Click(sender As Object, e As System.EventArgs) Handles btnLogin.Click 

     Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Brian\Documents\Visual Studio 2010\WebSites\PetLandia\App_Data\db.mdb") 
     Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [User] where Username=? and Password=?", conn) 

     cmd.Parameters.AddWithValue("@Username", txtLogin.Text) 
     cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 




     If (String.IsNullOrEmpty(txtLogin.Text)) Or (String.IsNullOrEmpty(txtPassword.Text)) Then 

      lblLoginError.Text = "One or more fields are empty. Please fill in all the fields" 
      lblLoginError.Visible = True 

     Else 

      conn.Open() 
      Dim read As OleDbDataReader = cmd.ExecuteReader() 

      Try 

       If read.HasRows Then 

        While read.Read() 

         If txtLogin.Text = read.Item("username").ToString And txtPassword.Text = read.Item("password").ToString Then 


          Dim tUsername As String = read.Item("Username").ToString 

          Session("Username") = tUsername 
          Response.Redirect("Default.aspx") 


         End If 
        End While 
       End If 

       read.Close() 
      Catch ex As Exception 
       Response.Write(ex.Message()) 
       lblLoginError.Text = "Incorrect Username/Password." 
       lblLoginError.Visible = True 

      Finally 
       conn.Close() 
      End Try 


     End If 

    End Sub 
+0

しかし、あなたのコードについて検討するもの:** 1 **常に 'あなたのオブジェクトをdispose'。 ** 2。**データベースへの開いている接続を閉じる前にリダイレクトすることはありません。 ** 3。**常に自分自身のメソッドにデータベースコードを入れてください。できれば、それ自身のレイヤーにあります。 **トピック内** 'ex.Message()'の値は何ですか? – balexandre

+0

balexandreに加えて、1.自分のセキュリティをロールしないでください。 2.パスワードをプレーンテキストで保管しないでください。 – Thomas

答えて

1

あなたはこのコードを試すことができます。このコードはTryCatchブロックなしです。

Protected Sub btnLogin_Click(sender As Object, e As System.EventArgs) Handles btnLogin.Click 

     If (String.IsNullOrEmpty(txtLogin.Text)) Or (String.IsNullOrEmpty(txtPassword.Text)) Then 
      lblLoginError.Text = "One or more fields are empty. Please fill in all the fields" 
      lblLoginError.Visible = True 

     Else 
      Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Brian\Documents\Visual Studio 2010\WebSites\PetLandia\App_Data\db.mdb") 
      Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [User] where Username=? and Password=?", conn) 
      cmd.Parameters.AddWithValue("@Username", txtLogin.Text) 
      cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 
      conn.Open() 
      Dim read As OleDbDataReader = cmd.ExecuteReader()  
        If read.HasRows Then 
         read.Read() 
         Session("Username") = read.Item("Username").ToString 
         read.Close() 
         conn.Close() 'Close connection before Redirecting. 
         Response.Redirect("Default.aspx")  
        Else 
         read.Close() 
         conn.Close() 
         lblLoginError.Text = "Incorrect Username/Password." 
         lblLoginError.Visible = True 

        End If 
      End If 
     End Sub 
+0

は動作しません。まだ最初のエラーメッセージが表示されます! – Brian

+0

「1つ以上のフィールドが空です。すべてのフィールドに入力してください」という意味です。私が何をしても、それはまだそれを示しています。 – Brian

+1

lblLoginError.Visible = false; これをあなたのpage_loadに入れてみてください。もしあなたがまだ持っていなければ、 – Thousand

2

代わりのcatch例外がスローされた場合の文

+0

内部Ifステートメントに変更する前に、あなたの答えを有用とマークしました。 ITYM read.HasRowsをチェックするIf文:一致するエントリがない場合、行はありません。 –

+0

@AndrewMortonええ、あなたは両方をチェックしなければならないでしょう。それは私がそれを "if文"に変更した理由です。 – Magnus

0

あなたがそれを書いた方法で、「不正なユーザー名/パスワードが」のみが表示されます場合にElseを書きます。あなたは、あなたがそれを書いたように、コードを使用したい場合は

、ELSE追加:

If txtLogin.Text = read.Item("username").ToString And txtPassword.Text = read.Item("password").ToString Then 


         Dim tUsername As String = read.Item("Username").ToString 

         Session("Username") = tUsername 
         Response.Redirect("Default.aspx") 
else 
throw new exception("Incorrect Username/Password") 
End If 
1

データベースからユーザー名とパスワードを取得しておく必要はありません。一致するエントリを数えるだけです。これにより大幅に簡素化されます。ジャムがあったとしても、それはデータベースとは何かを行う前に、ユーザー名とパスワードのフィールド内の値のテストを行う方が良いでしょう:

If (String.IsNullOrEmpty(txtLogin.Text)) OrElse (String.IsNullOrEmpty(txtPassword.Text)) Then 

    lblLoginError.Text = "One or more fields are empty. Please fill in all the fields" 
    lblLoginError.Visible = True 

Else 

    Dim ok As Integer = 0 

    Using conn = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Brian\Documents\Visual Studio 2010\WebSites\PetLandia\App_Data\db.mdb") 
     Dim cmd As OleDbCommand = New OleDbCommand("SELECT COUNT(*) FROM [User] where Username=? and Password=?", conn) 

     cmd.Parameters.AddWithValue("@Username", txtLogin.Text) 
     cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 

     conn.Open() 
     ok = CInt(cmd.ExecuteScalar()) 
     conn.Close() 
    End Using 

    If ok = 0 Then 
     ' credentials incorrect 
    Else 
     ' credentials correct 
    End If 

End If 
+0

ジャムと同じ問題が投稿されました。私はちょうど間違ったとラベルのものを置き換え、正しいとリダイレクト – Brian

+0

@ブライアンその後、txtLogin.TextまたはtxtPassword.Textはnullまたは空です。これらのコントロールは実行時に生成されますか? –

+0

いいえ、ボタンがクリックされたら、私は – Brian

0
  1. あなたがにつながった独自のセキュリティをロールバックすることを決定しました。..
  2. パスワードは、セキュリティ上の大きな穴であり、潜在的な原因となるプレーンテキストで保存されているようです。
  3. If read.HasRowsは、渡されたユーザー名とパスワードがデータベースに存在しない場合はfalseになります。つまり、例外がスローされることはありません。単純に行が返されません。
  4. あなたはDisposeを使い捨てオブジェクトに呼び出さなかった。
  5. ExecuteScalarを単に呼び出すと、結果が0より大きいかどうかを確認する方が簡単です。
  6. トピックOFF

Dim authenticationFailed As Boolean = String.IsNullOrEmpty(txtLogin.Text) _ 
    OrElse String.IsNullOrEmpty(txtPassword.Text) 

If Not authenticationFailed Then 
    Dim connString = "Provider=Microsoft.Jet.OLEDB.4.0..." 
    Using conn = New OleDbConnection(connString) 
     Const sql As String = "Select Count(*) From [User] Where Username=? and Password=?" 
     conn.Open() 
     Using cmd = New OleDbCommand(sql, conn) 
      cmd.Parameters.AddWithValue("@Username", txtLogin.Text) 
      cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 

      Try 
       Dim result = cmd.ExecuteScalar(CommandBehavior.CloseConnection) 
      Catch generatedExceptionName As SqlException 
       authenticationFailed = True 
      End Try 

      authenticationFailed = authenticationFailed _ 
       OrElse Convert.ToInt32(result) <> 1 

      If Not authenticationFailed Then 
       Session("Username") = txtLogin.Text 
      End If 
     End Using 

     conn.Close() 
    End Using 
End If 

If authenticationFailed Then 
    lblLoginError.Text = "Incorrect username and password" 
    lblLoginError.Visible = True 
End If 
関連する問題