Pregunta

Actualmente estoy haciendo un inicio de sesión personalizado en ASP.NET. He modificado el código del control de inicio de sesión para usar mi base de datos en lugar de la tabla ASPNET. Aquí hay una muestra de mi código;

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;


public partial class Login : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    // Custom login control
    protected void Login1_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
            string uname = Login1.UserName.Trim();
            string password = Login1.Password.Trim();

            bool flag = AuthenticateUser(uname, password);
            if (flag == true)
            {
                e.Authenticated = true;
                Login1.DestinationPageUrl = "Default.aspx";
            }
            else
                e.Authenticated = false;
        }
        catch (Exception)
        {
            e.Authenticated = false;
        }
    }

    private bool AuthenticateUser(string uname, string password)
    {
        bool bflag = false;
        string connString = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=CommonUser";
string connstring2 = "Server=DEVSERVER;User ID=sa;Password=whatpassword;Database=Admins";
        string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";
        DataSet userDS = new DataSet();
        SqlConnection m_conn;
        SqlDataAdapter m_dataAdapter;
        SqlCommand m_Command;
        try
        {
            m_conn = new SqlConnection(connString);
            m_conn.Open();
            m_dataAdapter = new SqlDataAdapter(strSQL, m_conn);
            m_dataAdapter.Fill(userDS);
            m_conn.Close();
        }
        catch (Exception)
        {
            userDS = null;
        }

        if (userDS != null)
        {
            if (userDS.Tables[0].Rows.Count > 0)
                bflag = true;
        }
        return bflag;

    }
}

Tengo otra base de datos para los usuarios administrativos. Entonces, mi pregunta es cómo puedo hacer que verifique la base de datos para los usuarios administrativos. Además, ¿cómo puedo restringir a los usuarios comunes de ciertas páginas como ~ admin/adminpages.aspx? Actualmente estoy tratando de figurar Este.

Cualquier ayuda sería muy apreciada;)

Gracias por adelantado

¿Fue útil?

Solución

Ok, voy a decir esto, pero sé que lo digo de la mejor manera posible ...

¡Lo estas haciendo mal!

No estoy argumentando en contra del uso de una base de datos personalizada aunque ASP.NET ya tiene esto incorporado. Ni siquiera estoy argumentando en contra de la codificación de la mano en un método cuando podrías estar usando el mismo Bonito modelo de proveedor conectable que ASP.NET se ha incorporado. En contra de lo que estoy argumentando es cuán amplio está este código para un Ataque de inyección SQL.

Considere por un segundo lo que pasaría si escribiera x'; DROP TABLE Users; -- como el nombre de usuario? Cosas malas hombre !!!!

Ok, así que sigue seriamente los enlaces que puse allí y por favor, por favor, al menos ¡Use consultas parametrizadas!

Otros consejos

Hay bastantes cosas mal con el código que publicó.

string strSQL = "Select * from dbo.Users where Username ='" + uname + "' and Password ='" + password + "'";

Nunca nunca hagas la concatenación de cadenas para construir una consulta. Esto deja su aplicación abierta a la inyección SQL. Use una consulta parametrizada en su lugar.

¿Por qué tiene una base de datos separada para administradores y usuarios comunes? ¿No almacenaría todos los inicios de sesión en una sola tabla en una sola base de datos? Luego use un solo campo "isadmin" o use una tabla de roles separado y la tabla de usuarios de los usuarios para determinar qué usuarios son administradores o no.

¿Cuál es su razón para no usar el proveedor de membresía Builtin? Configura el proveedor integrado para usar cualquier base de datos, no solo el AppData Aspnet.mdf.

Por lo general, restringe diferentes páginas a diferentes usuarios que usan roles, esto se puede configurar en el archivo web.config dentro del elemento de autorización.

Si realmente desea crear un sistema de autenticación simple personalizado, use algo como http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.htmlpara asignar manualmente los roles de usuario a la identidad del usuario.

Realmente creo que no deberías codificar los parámetros de conexión de la base de datos en absoluto. Es una mala práctica porque si el DB cambia, tendrá que recompilar. Entonces, lo que debe hacer es implementar una membresía personalizada y un proveedor de roles. Ver Este artículo. Básicamente, debe crear una clase personalizada que herede de System.Web.Security.Roleprovider y System.Web.Security.Membershipprovider. La membresía administra usuarios y roles, bueno. Permisos de usuario.

Después de que todo esté configurado, puede verificar los permisos de los usuarios a través de la propiedad Page.user en su archivo ASPX Page Code-Behind.

Para agregar mi voz a la mezcla. Aquellos que no aprenden de la historia están condenados a repetirlo. El sistema de membresía ASP.NET es el resultado de años de personas que intentan implementar sus propios sistemas de autenticación de usuarios. Microsoft aprendió de eso. Por lo que debería.

Use el modelo de proveedor de membresía. Si no desea usar el proveedor predeterminado, implementa su propio personalizado. Pero honestamente, es muy fácil usar el proveedor incorporado y adaptarlo a lo que quieras.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top