none
Problemas con mi formulario login RRS feed

  • Pregunta

  • Tengo un formulario que sirve para que los usuarios se logeen , en si hace una comparacion en la base de datos para  saber si existe tal usuario, en este codigo que pongo abajo cuando el usuario y el pass existen le redirecciona a la pagina principal, pero cuando los datos son erroneos el formulario no redirecciona permanece ahi mismo. Pero el problema es que no me muestre el mensaje de error de "Datos erroneos", cual creen que sea el problema ?

    Public Class Login Inherits System.Web.UI.Page Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString Dim con As New SqlConnection(conString) Dim da As New SqlDataAdapter("select * from [dbo].[Dat_Alumno]", con) Dim ds As New DataSet Public IDAlumno As String = "" Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load lblmsger.Text = ""

    lblmsger.Visible = False txtusuario.Focus() End Sub Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click Dim fila As DataRow Dim nombre As String = "" da.SelectCommand.CommandText = "select top 1 * from [dbo].[Dat_Alumno] where IDAlumno = '" & txtusuario.Text & "' and DNI = '" & txtpass.Text & "'" da.Fill(ds, "dato") If ds.Tables("dato").Rows.Count = 0 Then Response.Redirect("Login.aspx")

      lblmsger.Text = "Datos erroneos" lblmsger.Visible = True End If For Each fila In ds.Tables("dato").Rows nombre = fila("Nombres") IDAlumno = fila("IDAlumno") Next Session.Add("Nombres", nombre) Session.Add("IDAlumno", IDAlumno) Response.Redirect("~/Modalidades/InfoModalidades.aspx") End Sub End Class


    lunes, 13 de abril de 2015 22:23

Respuestas

  • hola

    lo primero que puedo comentar es que deberia usar parmetros en las queries que definas

    segundo para validar el login no se usa un datatable ,se usa el ExecuteScalar()

    tercero NUNCA se definen los objetos de conexion a datos de forma global

     Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click
    	
    	If Not Autenticar(txtusuario.Text, txtpass.Text) Then
    		lblmsger.Text = "Datos erroneos"
    		lblmsger.Visible = True
    		Return
    	End If
    
    	Dim dt As DataTable = ObtenerUsuario(txtusuario.Text)
    	Dim row As DataRow = dt.Rows(0);
    	
    	Session.Add("Nombres", row("Nombres"))
    	Session.Add("IDAlumno", row("IDAlumno"))
    	Response.Redirect("~/Modalidades/InfoModalidades.aspx")
    	
    End Sub
    
    
    Private Function Autenticar(usuario As String, password As String) As Boolean
    
    	Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString
    	Using con As New SqlConnection(conString)
    		con.Open()
    		
    		Dim query As String = "select COUNT(*) from [dbo].[Dat_Alumno] where IDAlumno = @usuario and DNI = @password"
    		Dim cmd As New SqlCommand(query, con)
    		cmd.Parameter.AddWithValue("@usuario", usuario)
    		cmd.Parameter.AddWithValue("@password", password)
    		
    		Return Convert.ToInt32(cmd.ExecuteScalar())
    		
    	End Using
    
    End Function
    
    Private Function ObtenerUsuario(usuario As String) As DataTable
    
    	Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString
    	Using con As New SqlConnection(conString)
    		con.Open()
    		
    		Dim query As String = "select * from [dbo].[Dat_Alumno] where IDAlumno = @usuario"
    		Dim cmd As New SqlCommand(query, con)
    		cmd.Parameter.AddWithValue("@usuario", usuario)
    		
    		Dim dt As New DataTable
    		Dim da As New SqlDataAdapter(cmd)
    		da.Fill(dt)
    		
    		Return dt
    		
    	End Using
    
    End Function

    como veras se usan funciones para hacer mas prolijo el codigo

    ademas estas seguro que en el WHERE asignas las columasn correctas, me pare que un DNI no deberia comparase con el password, eso esta raro, deberias verificarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta fredsale martes, 14 de abril de 2015 3:55
    martes, 14 de abril de 2015 2:23

Todas las respuestas

  • El problema es que cuando no validas el usuario haces también un Redirect con lo que la página se vuelve a cargar por completo y el código posterior no tiene ningún efecto sobre la visualización:

        Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click
            Dim fila As DataRow
            Dim nombre As String = ""
    
            da.SelectCommand.CommandText = "select top 1 * from [dbo].[Dat_Alumno] where IDAlumno = '" & txtusuario.Text & "' and DNI = '" & txtpass.Text & "'"
            da.Fill(ds, "dato")
            If ds.Tables("dato").Rows.Count = 0 Then
                lblmsger.Text = "Datos erroneos"
                lblmsger.Visible = True
            Else
              nombre = ds.Tables("dato").Rows(0)("Nombres")
              IDAlumno = ds.Tables("dato").Rows(0)("IdAlumno")
              Session.Add("Nombres", nombre)
              Session.Add("IDAlumno", IDAlumno)
              Response.Redirect("~/Modalidades/InfoModalidades.aspx")
            End If
        End Sub
    
    
    

    • Propuesto como respuesta Luis Vivanco martes, 14 de abril de 2015 0:09
    lunes, 13 de abril de 2015 22:35
  • hola

    lo primero que puedo comentar es que deberia usar parmetros en las queries que definas

    segundo para validar el login no se usa un datatable ,se usa el ExecuteScalar()

    tercero NUNCA se definen los objetos de conexion a datos de forma global

     Protected Sub btningresar_Click(sender As Object, e As EventArgs) Handles btningresar.Click
    	
    	If Not Autenticar(txtusuario.Text, txtpass.Text) Then
    		lblmsger.Text = "Datos erroneos"
    		lblmsger.Visible = True
    		Return
    	End If
    
    	Dim dt As DataTable = ObtenerUsuario(txtusuario.Text)
    	Dim row As DataRow = dt.Rows(0);
    	
    	Session.Add("Nombres", row("Nombres"))
    	Session.Add("IDAlumno", row("IDAlumno"))
    	Response.Redirect("~/Modalidades/InfoModalidades.aspx")
    	
    End Sub
    
    
    Private Function Autenticar(usuario As String, password As String) As Boolean
    
    	Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString
    	Using con As New SqlConnection(conString)
    		con.Open()
    		
    		Dim query As String = "select COUNT(*) from [dbo].[Dat_Alumno] where IDAlumno = @usuario and DNI = @password"
    		Dim cmd As New SqlCommand(query, con)
    		cmd.Parameter.AddWithValue("@usuario", usuario)
    		cmd.Parameter.AddWithValue("@password", password)
    		
    		Return Convert.ToInt32(cmd.ExecuteScalar())
    		
    	End Using
    
    End Function
    
    Private Function ObtenerUsuario(usuario As String) As DataTable
    
    	Dim conString As String = ConfigurationManager.ConnectionStrings("ConString").ConnectionString
    	Using con As New SqlConnection(conString)
    		con.Open()
    		
    		Dim query As String = "select * from [dbo].[Dat_Alumno] where IDAlumno = @usuario"
    		Dim cmd As New SqlCommand(query, con)
    		cmd.Parameter.AddWithValue("@usuario", usuario)
    		
    		Dim dt As New DataTable
    		Dim da As New SqlDataAdapter(cmd)
    		da.Fill(dt)
    		
    		Return dt
    		
    	End Using
    
    End Function

    como veras se usan funciones para hacer mas prolijo el codigo

    ademas estas seguro que en el WHERE asignas las columasn correctas, me pare que un DNI no deberia comparase con el password, eso esta raro, deberias verificarlo

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta fredsale martes, 14 de abril de 2015 3:55
    martes, 14 de abril de 2015 2:23