Underc0de

Foros Generales => Dudas y pedidos generales => Mensaje iniciado por: rush en Enero 04, 2016, 04:33:31 PM

Título: [SOLUCIONADO] Problemas y preguntas LOGIN ASP.NET
Publicado por: rush en Enero 04, 2016, 04:33:31 PM
Buenas, hace tiempo estoy haciendo un proyecto, parece ser que no acabo de aprender y cada vez me topo con la pared cuando aparece cosas nuevas, ahora me toco la parte de hacer un login en asp.net, pero con diferentes tipos de usuario, en este caso solo tengo 2 tipos, usuarios visitantes y usuarios administradores, e buscado como crear un login, pero nadie habla mucho acerca de como ocultar links, opciones etc, jamas e creado un sitio o aplicación en la cual tenga mas de 1 tipo de usuario, así que no se como se manejan las vistas, lo mas fácil es que cree una vista para los usuarios y otra vista para los administradores, pero no se si es lo mas correcto o de que manera se tiene que hacer, esta es la estructura del sitio

(http://i.imgur.com/l42Oy5a.png)
(No juzguen la apariencia xD)

Esa seria la estructura del administrador, asi que ahi no tengo mucho problema, pero si yo quiero que entre un visitante, solo podra ver el area de catalogos, como puedo ocultar todo lo demas?, tengo que crear una nueva vista o una nueva master page o como es que funciona esto?, quiero que se vea de la siguiente manera.

(http://i.imgur.com/hBkpzpT.png)

Otra pregunta, ya lei la diferencia entre la cookie y sessiones, lo mas seguro es que utilice sessiones y les de un timeout, ahora como puedo validar que un usuario tenga permisos sobre esa ruta o no, la idea que tuve fue hacer una consulta que me devuelva el nombre de usuario y el tipo de usuario y subirlo a session
al tener el evento page_load verificar el el usuario es de tipo ADMIN o VISITANTE, dependiendo de estoy cargar la pagina o no, espero puedan ayudarme saludos.
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: blackdrake en Enero 05, 2016, 09:09:04 AM
Hola! te dejo un fragmento de código que tenía de una vieja web en asp.net

Login.aspx.cs
Código (asp) [Seleccionar]
try
        {
            SqlConnection conexion = new SqlConnection(StrCadenaConexion);
            SqlCommand comando = new SqlCommand(StrComandoSql, conexion);
            conexion.Open();
            SqlDataReader reader = comando.ExecuteReader();
            if (reader.Read())
            {
                Session.Add("Id", reader.GetInt32(0));
                Session.Add("Nombre", reader.GetString(1));
                Session.Add("Rol", reader.GetString(2));
                e.Authenticated = true;
                reader.Close();
                comando.Dispose();
                conexion.Close();

                if (Convert.ToString(Session["Rol"]) == "A")
                    Response.Redirect("~/Admin.aspx");
                if (Convert.ToString(Session["Rol"]) == "U")
                    Response.Redirect("~/Default.aspx");
            }
            else
            {
                e.Authenticated = false;
                reader.Close();
                comando.Dispose();
                conexion.Close();
                lblEstado.Visible = true;
                lblEstado.Text = "El email o la contraseña introducidos no son válidos";
            }


Personalmente, era de una tienda online, donde el administrador del sitio NO podía comprar (por eso lo redirijo automáticamente a admin.aspx).

Pero, en la master page, si que jugué con las sesiones para cargar algunas opciones del menú u otras (lo que tu puedes hacer, es una página idéntica para los dos y mostrar diferentes opciones así):

MasterPage.master.cs
Código (asp) [Seleccionar]
protected void Page_Load(object sender, EventArgs e)
    {
        if (Convert.ToString(Session["Rol"]) == "U")
        {
            lblLogin.Text = "<ul class='nav navbar-nav'><li><a href='default.aspx'>Inicio</a></li><li><a href='catalogo.aspx?categoria=0'>Catalogo</a></li><li><a href='carrito.aspx'>Carrito</a></li>";
            lblLogin.Text += "<li><a href='pedidos.aspx'>Mis Pedidos</a></li>";
            lblLogin.Text += "<li><a href='perfil.aspx'>Mi cuenta</a></li><li><a href='contacto.aspx'>Soporte</a></li>";
            lblLogin.Text += "<li><a href='logout.aspx'>Cerrar Sesión</a></li></ul>";
        }
        else
        {
            lblLogin.Text = "<ul class='nav navbar-nav'><li><a href='default.aspx'>Inicio</a></li><li><a href='catalogo.aspx?categoria=0'>Catalogo</a></li><li><a href='contacto.aspx'>Contacto</a></li>";
            lblLogin.Text += "<li><a href='login.aspx'>Acceder</a></li></ul>";
        }
        if (Convert.ToString(Session["Rol"]) == "A")
        {
            lblLogin.Text = "<ul class='nav navbar-nav'><li><a href='default.aspx'>Inicio</a></li><li><a href='catalogo.aspx?categoria=0'>Catalogo</a></li>";
            lblLogin.Text += "<li><a href='Admin.aspx'>Administración</a></li>";
            lblLogin.Text += "<li><a href='logout.aspx'>Cerrar Sesión</a></li></ul>";
        }
    }


(http://i.imgur.com/Jmc5yL2.png)
(http://i.imgur.com/iUJJ3JW.png)
(http://i.imgur.com/TSSR0ZG.png)

NOTA: Los logins de asp por defecto son vulnerables a sqli, puesto a que era para clase hice una chapuzilla rápido para evitarlo, pero así te haces una ídea :D

Login.aspx.cs
Código (asp) [Seleccionar]
//Evitamos sqli --> 'or '1'='1
    if (Login1.UserName.Contains("'") || Login1.Password.Contains("'"))
    {
        lblEstado.Visible = true;
        lblEstado.Text = "Sqli Detectado";
        sqli(ip);
    }


(http://i.imgur.com/FF5WGHE.png)


Espero que te haya servido.

Saludos.
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: rush en Enero 05, 2016, 01:11:49 PM
Gracias blackdrake, me diste varias ideas, supongo que para que no puedan acceder por url verificas los permisos en el page_load y si no estan logeados los rediriges, para lo de SQLI lei que haciendolo de esta manera se evitaba el fallo de seguridad:

(http://i.imgur.com/7gZnmuM.png)

Gracias por el gran aporte, no hubiera estado mejor explicado!
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: blackdrake en Enero 05, 2016, 01:51:47 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Gracias blackdrake, me diste varias ideas, supongo que para que no puedan acceder por url verificas los permisos en el page_load y si no estan logeados los rediriges, para lo de SQLI lei que haciendolo de esta manera se evitaba el fallo de seguridad:

(http://i.imgur.com/7gZnmuM.png)

Gracias por el gran aporte, no hubiera estado mejor explicado!

Exacto, también es una posibilidad (yo lo hice también así porque guardaba los intentos de sqli en la BD).

Citarsupongo que para que no puedan acceder por url verificas los permisos en el page_load y si no estan logeados los rediriges
Exacto :D

Doy el tema por solucionado entonces @rush (https://underc0de.org/foro/index.php?action=profile;u=37736)?

Saludos.
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: rush en Enero 05, 2016, 02:11:14 PM
Solo una cosa mas, en las sessiones, como para destruir la session se usa Session.Clear()?
Que pasa si varios usuarios inician sesion con el mismo usuario?
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: blackdrake en Enero 05, 2016, 02:53:00 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Solo una cosa mas, en las sessiones, como para destruir la session se usa Session.Clear()?
Que pasa si varios usuarios inician sesion con el mismo usuario?

Puedes utilizar:

Código (asp) [Seleccionar]
Session.Clear();
Session.Abandon();


En cuanto a: Que pasa si varios usuarios inician sesion con el mismo usuario?

No pasaría nada, cada uno se trataría como usuarios "independientes" pudiendo cerrar sesión cada uno cuando quisiera.

Obviamente si se modifica por ejemplo el perfil, al ser la misma cuenta, verían todos el cambio.

Saludos.
Título: Re:Problemas y preguntas LOGIN ASP.NET
Publicado por: rush en Enero 05, 2016, 02:56:43 PM
Ok gracias por tus respuestas blackdrake, puedes darlo por solucionado excelente ayuda!