2011-04-28 20 views
8

Actualmente estoy haciendo un inicio de sesión personalizado en ASP.NET. Modifiqué 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;Inicio de sesión personalizado ASP.NET C#

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 de Admin. Entonces mi pregunta es cómo puedo hacer que verifique la base de datos para los usuarios administradores. ¿También cómo puedo restringir usuarios comunes de ciertas páginas como ~ Admin/AdminPages.aspx? Actualmente estoy tratando de calcular This.

Cualquier ayuda sería muy apreciada;)

Gracias de antemano

+0

por qué ... ¿está recortando la contraseña? Algunas personas agregan uno o más espacios al final (o al principio) para que sea más difícil para alguien que ve la contraseña en texto claro para robarla. –

Respuesta

20

Ok, por lo que voy a decir esto, pero sé que quiero decir que en la mejor manera posible ...

Usted está haciendo mal!

No estoy argumentando en contra de la utilización de una base de datos personalizada a pesar de Asp.Net already has this built in. ni siquiera estoy argumentando en contra de la mano de codificación esto en un método en que usted podría estar usando el mismo nice pluggable provider model que se ha construido en Asp.Net . Lo que estoy discutiendo es qué tan abierto está este código a un Sql Injection attack.

Considere por un segundo lo que sucedería si escribiera x'; DROP TABLE Users; -- como nombre de usuario? MAL COSAS HOMBRE !!!!

Ok, así que siga seriamente los enlaces que pongo ahí y por favor por favor por favor por lo menos use parameterized queries!

+0

Gracias por el consejo. Soy consciente de la amenaza de la inyección de sql es solo que he hecho esto sobre la marcha y no lo implementaré hasta que haya terminado de hacer mi proveedor de membresía personalizado. También estoy buscando una manera de hacerlo menos vulnerable. Creo que he escuchado que puedes usar parámetros en consultas como en http://www.daniweb.com/software-development/csharp/threads/301561 – Loupi

2

Realmente cree que no debe codificar los parámetros de conexión de base de datos en absoluto. Es una mala práctica porque si la base de datos cambia, tendrá que volver a compilar. Entonces, lo que debe hacer es implementar una membresía personalizada y un proveedor de roles. Consulte this article. Básicamente, necesita crear una clase personalizada que herede de System.Web.Security.RoleProvider y System.Web.Security.MembershipProvider. La membresía administra usuarios y roles, así ... permisos de usuario.

Después de que todo esté configurado, puede verificar los permisos de usuario a través de la página. Propiedad del usuario en su archivo aspx page-behind code.

5

Hay unas cuantas cosas mal con el código que envió.

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

nunca jamás hacer la concatenación de cadenas para crear una consulta. Esto deja su aplicación abierta a SQL Injection. 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? A continuación, utilice un solo campo "IsAdmin" o use una tabla Roles separada y una tabla UsersInRoles para determinar qué usuarios son Admin o no.

¿Cuál es su razón para no utilizar el proveedor de membresía incorporado? Usted configura el proveedor integrado para utilizar cualquier base de datos, no solo AppData \ aspnet.mdf.

Normalmente restringe diferentes páginas a diferentes usuarios utilizando Roles, esto se puede establecer en el archivo web.config dentro del elemento de autorización.

Si REALMENTE desea crear un sistema de autenticación simple personalizado, utilice algo como http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html para asignar manualmente las funciones de usuario a la identidad del usuario.

+0

Aye lo tendrá en cuenta;) – Loupi

2

Para agregar mi voz a la mezcla. Aquellos que no aprenden de la historia están condenados a repetirlo. El sistema de membresía de 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.

Utilice el modelo de proveedor de membresía. Si no desea utilizar el proveedor predeterminado, implemente el suyo personalizado. Pero, sinceramente, es muy fácil usar el proveedor integrado y adaptarlo a lo que quieras.

+2

Incluso mencionaré que es bastante fácil implementar un proveedor personalizado también. Lo he hecho muchas veces y realmente no es terriblemente difícil. – Josh

+0

La membresía solía tener muchos inconvenientes, no es de extrañar que haya sido reescrito por Microsoft (mucho tiempo) después de su respuesta ... –

+0

@ AndreiRînea - Incluso con sus inconvenientes, era mejor que rodar cosas usted mismo, la identidad más nueva es una mejor solución, pero eso no significa que la membresía (en el pasado) no fue la mejor solución. –

Cuestiones relacionadas