ASP.NET - Login C# con base SQL SERVER y un log

 
Vista:
Imágen de perfil de nano

Login C# con base SQL SERVER y un log

Publicado por nano (14 intervenciones) el 26/02/2016 21:32:04
Muy buenas a todos!!!
La duda que se me plantea es la de poner una autenticación en mi formulario web, donde necesito vuestra colaboración para ir perfilando ideas. El temas es el siguiente:
Ya tengo creada una tabla llamada usuarios en SQL SERVER con usuario y password contra la que se va a loguear el acceso a mi web.
Por otro lado, si la autenticación es correcta tengo que insertar en otra tabla llamada LOG los datos de ese usario tales como id_log(autoincremental),id_usuario, nombre, datetime.now, aplicacion.
Hasta aquí, digamos que es algo mas o menos normal. Mi problema reside cuando yo tengo 5 páginas diferentes para distintos procesos como listar, insertar datos, etc...
Para mas datos todas mis páginas tiene una masterpage.master con una barra de menú con los accesos a las diferentes páginas que os comentaba incluyendo la del login...llamada default.aspx.
Si yo escribiera directamente el nombre de la url en el navegador me carga la página en cuestión cuando lo que necesito es que no carge y vuelva a mi página defaul.aspx. Es posible hacerlo en el event_load con una especie de IsPostBack? En caso afirmativo, contra que dato debo validar? Con el Id_log?

En mi default.aspx tengo ya en un botón una especie de validación donde compara en la tabla usuarios y me inserta los datos del LOG excepto el codigo usuario de la tabla USUARIOS que no se como obtener para añadir al LOG. Lo he puesto con interrogaciones.

SqlConnection conlogin = new SqlConnection("Misdatosdeconexion");
SqlDataAdapter sda = new SqlDataAdapter("Select count(*) From usuarios where nombre='" + txtusuario.Text + "'and pw='" + txtpassword.Text + "'", conlogin);
DataTable dt = new DataTable();
sda.Fill(dt);

if (dt.Rows[0][0].ToString() == "1")
{
cls_login cl_log = new cls_login("","","","",0,0,0,DateTime.Now);

cl_log.@usuario = txtusuario.Text;
cl_log.@operacion = "";
cl_log.@error = "E250";
cl_log.@version = "";
cl_log.@codigo = 0;
cl_log.@codigo_usuario = ????????
cl_log.@id_aplicacion = 0;
cl_log.@fecha = DateTime.Now;

cl_log.agregarlogin();

}
else
{
lblmensaje.Text = "ERROR EN LA VALIDACION DEL USUARIO.";
txtusuario.Text = "";
txtpassword.Text = "";
txtusuario.Focus();
}

Espero no haberme extendido mas de la cuenta y haberos aburrido, pues entiendo que son muchas consultas en una para hacer un logueo en condiciones.
Un cordial saludo y gracias de antemano.
Nano.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de nano

Login C# con base SQL SERVER y un log

Publicado por nano (14 intervenciones) el 28/02/2016 09:06:01
Muy buenas de nuevo!!!
Ye he conseguido un formulario que autentique sobre la tabla USUARIOS en una base de datos SQL. e inserta una serie de datos en la tabla llamada LOG.

loginweb

Además con un Response.Redirect redirijo la web a la página principal llamada pagina2.aspx con un valor de un labeltext que necesito como comprobación en todas las demás páginas que se corresponde con el nombre del usuario.

1
2
String Valor = lbluser.Text;
Response.Redirect("pagina2.aspx?Valor=" + Valor);

En la pagina2.aspx tengo un control que examina que si el dato Valor obtenido de la página default.aspx es nulo, me vuelva de nuevo a la pagina del login.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
protected void Page_Load(object sender, EventArgs e)
    {
        String Valor = Request.QueryString["Valor"];
        lbl_log.Text = Valor;
 
        String userid = lbl_log.Text;
        if (!IsPostBack)
        {
            if (userid == "" || userid == null)
                Response.Redirect("Default.aspx");
            else
            {
 
            }

Mi problema reside que en la pagina2.aspx tengo un menú de una masterpage.master con diversas páginas que quiero que mantengan ese mismo control:


menuweb

Sabeis de que modo podría enviar ese dato a todas las páginas web de mi proyecto?
Pues si cargo una tercera página llamada pagina3.aspx y me vuelvo a la anterior pagina2.aspx pierdo el dato de Valor y al estar en blanco me redirije automáticamente a la página inicial de logueo.
Muchas gracias de antemano y un saludo,
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier
Val: 33
Ha disminuido 1 puesto en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Login C# con base SQL SERVER y un log

Publicado por Javier (17 intervenciones) el 29/02/2016 00:27:24
Podrias utilizar valores de Sesion.

1
Session["El nombre que le quieras dar"] = a tu valor que tomas de la BD.

este valor Session lo puedes cargar en todas las paginas de tu aplicacion.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de nano

Login C# con base SQL SERVER y un log

Publicado por nano (14 intervenciones) el 29/02/2016 01:24:30
Estoy de acuerdo con tu propuesta, Javier, pero hay algo que me da error y no doy con ello...
En la pagina1.aspx pongo lo siguiente:

Session["Valor"] = lbluser.Text;

Y en la pagina2.aspx en el evento load, pongo esto otro:

lbl_log.Text = this.Session["Valor"].ToString();

Y esta última línea, cuando cargo la pagina2.aspx, es la que me da el error:
Referencia a objeto no establecida como instancia de un objeto.

Gracias y un saludo,
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Javier
Val: 33
Ha disminuido 1 puesto en ASP.NET (en relación al último mes)
Gráfica de ASP.NET

Login C# con base SQL SERVER y un log

Publicado por Javier (17 intervenciones) el 29/02/2016 05:08:26
Como comentario te podria decir que el valor de la variable puedes asignarlo desde la respuesta de tu consulta, claro este depende del funcionamiento de la variable, para que la quieras utilizar, te dejo un pedazo de codigo de como la asigno y como la recupero en otras paginas en algunas aplicaciones que he realizado, espero y te sirva de ayuda.

Al hacer el Login, puede ser la accion de un boton por ejemplo.

1
2
3
4
5
6
7
8
9
10
11
12
13
if (IsValid)
            {
                ClaseParaValidarUsuarioenSQL Vuser = new  ClaseParaValidarUsuarioenSQL();
 
                string Respuesta = Vuser.ValidarUser(lblUser.Value, lblPass.Value);
 
                if (Respuesta == null) { Response.Redirect("login.aspx"); }
                else
                {
                    Session["Variable"] = Respuesta;
                    Response.Redirect("Principal.aspx");
                }
            }



en el LOAD de la siguiente pagina.

1
2
if (!Page.IsPostBack)
LoginName1.InnerText = Session["Variable"].ToString();


En este ejemplo estoy insertando el nombre completo del usuario en una etiqueta <SPAN> con ID="LoginName1" al hacer el LOAD de la pagina llamada Principal.aspx.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Login C# con base SQL SERVER y un log

Publicado por khristian (83 intervenciones) el 29/02/2016 19:22:35
Utiliza la autenticacion pues...
despues en cada página en el load verificas si el usuario esta logeado... si no lo está, lo rediriges.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nano

Login C# con base SQL SERVER y un log

Publicado por nano (14 intervenciones) el 01/03/2016 10:40:17
Gracias, Khristian.
Aunque la cosa va mejorando poco a poco me aparecen errores que debo ir depurando uno a uno. Mi primer error reside en la autenticación del usuario en el caso de insertar un nombre que no existe en mi tabla USUARIOS de SQL SERVER.
Me explico:
En mi página defalult.aspx tengo lo siguiente en un boton llamado ingresar:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
protected void btningresar_Click(object sender, EventArgs e)
    {
        {
            string strConexion = ConfigurationManager.ConnectionStrings["MINOMBREDECONEXION"].ConnectionString;
            SqlDataAdapter sdap = new SqlDataAdapter("Select count(*) From usuarios where nombre='" + txtusuario.Text + "'and pw='" + txtpassword.Text + "'", strConexion);
 
            DataTable dtso = new DataTable();
            sdap.Fill(dtso);
 
            gridlog.DataSource = dt2;
            gridlog.DataBind();
            GridViewRow row = gridlog.Rows[0];
            lblmensaje.Text = Convert.ToString(row.Cells[0].Text);
            lbluser.Text = Convert.ToString(row.Cells[2].Text);
 
            if (dtso.Rows[0][0].ToString() == "1")
            {
                cls_login cl_log = new cls_login("", "", "", "", 0, 0, 0, DateTime.Now);
 
                cl_log.@usuario = txtusuario.Text;
                cl_log.@operacion = "";
                cl_log.@error = "E250";
                cl_log.@version = "";
                cl_log.@codigo = 0;
                cl_log.@codigo_usuario = int.Parse(lblmensaje.Text);
                cl_log.@id_aplicacion = 0;
                cl_log.@fecha = DateTime.Now;
 
                cl_log.agregarlogin();
 
                Session["Usuario"] = lbluser.Text;
 
                String Valor = lbluser.Text;
                Response.Redirect("VentaOperadora.aspx?Valor=" + Valor);
 
}

Bien... a la hora de loguerame si el NOMBRE que escribo está el tabla de SQL pero la contraseña no, me aparece el mensaje y me deja rellenar de nuevo con lo cual... Todo correcto!!!

errorloguin1

si el NOMBRE que introduzco no está en la tabla usuarios de SQL SERVER me salta este error:

errorloguin2

Intuyo que al no tener fila ninguna el grid, el valor es menor que cero y me salta el error. Como puedo solventarlo?
Muchas gracias de antemano y un saludo a todos.
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de nano

Login C# con base SQL SERVER y un log

Publicado por nano (14 intervenciones) el 01/03/2016 13:15:49
Continuando con este extenso tema os comento que ya he encontrado la solución para el logueo de la página default.aspx.
Creo la conexión, hago el select y lo almaceno a un datareader.
La solución, quitando el gridview que no me aportaba nada mas que problemas.
Si el DataReader tiene lineas, es porque hay una coincidencia... luego extraigo el valor del campo codigo del datareader e inserto las lineas que necesito en mi tabla LOG.
Guardo el valor de mi textbox llamado usuario en una variable de sesion llamada Usuario y redirecciono a la nueva web.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
protected void btningresar_Click(object sender, EventArgs e)
{
        string cad = @"MISDATOSDECONEXION";
        string cadena = "SELECT * FROM usuarios where nombre='" + txtusuario.Text + "'and pw='" + txtpassword.Text + "'";
 
        SqlConnection conexion = new SqlConnection(cad);
        conexion.Open();
        SqlCommand comando = new SqlCommand(cadena, conexion);
        comando.ExecuteNonQuery();
 
        SqlDataReader dr;
        dr = comando.ExecuteReader();
 
        if (dr.Read())
        {
            if (dr.HasRows)
            {
                lblmensaje.Text = dr["codigo"].ToString();
 
                cls_login cl_log = new cls_login("", "", "", "", 0, 0, 0, DateTime.Now);
 
                cl_log.@usuario = txtusuario.Text;
                cl_log.@operacion = "";
                cl_log.@error = "E250";
                cl_log.@version = "";
                cl_log.@codigo = 0;
                cl_log.@codigo_usuario = int.Parse(lblmensaje.Text);
                cl_log.@id_aplicacion = 0;
                cl_log.@fecha = DateTime.Now;
 
                cl_log.agregarlogin();
 
                Session["Usuario"] = txtusuario.Text;
                Response.Redirect("pagina2.aspx");
            }
            else
                Error();
        }
        else
        {
            Error();
        }
            conexion.Close();
        }
}

Ahora ya me funciona y valida correctamente, además de que me aparece el mensaje de error cuando el nombre no es correcto, tantas veces como quiera.
Tan sólo me falta recuperar el valor de sesión Usuario en el resto de las páginas.
Un saludo a todos,
Nano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar