2012-05-05 2 views
0

코드에서 무엇이 잘못 되었습니까?VB.NET - ASP.NET - 잘못된 사용자 이름/암호 (유효성 검사)

사용자 이름과 암호가 일치하지 않으면 lbl 텍스트에 "잘못된 사용자 이름/암호"가 표시됩니다.

코드 :

대신 catch
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

"하나 이상의 필드가 비어 있습니다. 모든 필드를 입력하십시오."와 같은 의미입니다. 내가하는 일이 무엇이든, 아직도 그걸 보여줍니다. – Brian

+1

lblLoginError.Visible = false; 이것을 page_load에 넣으십시오. (아직 작성하지 않은 경우) – Thousand

2

이 예외가 발생되는 경우 문

+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은 전달 된 사용자 이름과 암호가 데이터베이스에없는 경우 거짓입니다. 즉, 예외를 throw하지는 않으며 행을 반환하지 않습니다.
  4. 일회용 개체에 Dispose을 호출하지 않았습니다.
  5. 으로 ExecuteScalar을 호출하면 결과가 0보다 더 빨리 표시됩니다.
주제 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