2008-09-30 23 views
9

Quiero hacer un sistema de inicio de sesión utilizando ASP.NET (MVC).Mejores prácticas de inicio de sesión de usuario de ASP.NET

En Internet, encontré algunos ejemplos malos que involucraban SQL en eventos de Click. Otra información apuntaba al proveedor de membresía incorporado de ASP.NET.

Sin embargo, quiero lanzar el mío. No quiero usar el proveedor de membresía integrado, ya que parece que solo funciona en MS SQL, y no me gusta la idea de tener algunas tablas extrañas en mi base de datos.

Probablemente podría pensar en algo, pero necesito algunos consejos en la dirección correcta. No tiene que ser de alta seguridad, sino solo seguridad de sentido común.

y tengo un par de preguntas directas:

  1. Una gran cantidad de sistemas parecen tener el ID de sesión se almacena en una tabla de usuario. Supongo que esto es vincular una sesión a un usuario para evitar el secuestro. ¿Verifique esto cada vez que un usuario ingresa a una página? ¿Y qué hago si la sesión expira?

  2. Hashing, salazón, ¿qué hace? Sé de hash MD5 y lo he usado antes. Pero no salando.

  3. ¿Mejores prácticas para las cookies?

Respuesta

5

No conozco las mejores prácticas, pero puedo decirles lo que hago. No es una gran seguridad, pero cumple su función.

Uso la autenticación de formularios. Recibo la contraseña asegurada con SSL a través de un cuadro de texto en la página de inicio de sesión. Tomo esa contraseña y la hash. (Hashing es como el cifrado unidireccional, puede obtener el código hash que no se puede revertir a la contraseña). Tomo ese hash y lo comparo con el hash de los usuarios en la base de datos. Si coincide con el hash, uso asp.nets integrado en el manejo de la autenticación, que maneja las cookies para mí.

La clase FormsAuthentication tiene métodos disponibles para hacer esto, como SetAuthCookie y RedirectFromLogin. ellos establecerán la cookie y los marcarán como autenticados. La cookie que utiliza asp.net está encriptada. No puedo hablar por su nivel de seguridad, pero es bastante común.

En mi clase hago la comprobación de la contraseña y el uso de FormsAuth para manejar el resto:

if(SecurityHelper.LoginUser(txtUsername.Text, txtPassword.Text)) 
{  
    FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, true); 
} 
+1

Actaully no lo hace! Esto usa mi propia autenticación y no toca el marco del proveedor de membresía en absoluto. ¡Apuesto a que recientemente me bajaste de mi primo por esto también! No me importa, pero debes verificar la autenticación de formularios personalizados de asp.net ... – mattlant

+0

El método que utilicé arriba, \ SecurityHelper.LoginUser es mi propia clase, que hace mi propia verificación contra mis propias tablas de db, etc. método establece la cookie. Nada de esto usa el marco de membresía en absoluto. – mattlant

2

El proveedor integrado funciona bien. Realmente funciona con MySQL, aunque no me pareció tan sencillo como la versión MS SQL. Si puede usar, hágalo, le ahorrará horas de trabajo.

Si necesita utilizar otro almacén de datos, entonces estoy de acuerdo con axel_c, si fuera a hacer mi propia cuenta, escribiría un proveedor de membresía según las especificaciones de MS. Hará que el código sea más fácil de mantener para los desarrolladores que lo siguen.

0

Una desventaja del proveedor de membresía de Microsoft es que no puede usarlo en un enfoque impulsado por el dominio.Si lo desea, puede crear su propio objeto de usuario con su propio hash de contraseña y seguir usando las cookies de autenticación proporcionadas por Microsoft. El uso de estas cookies de autenticación significa que no tiene que administrar los ID de sesión usted mismo.

public void SignIn(User user) 
     { 
      FormsAuthentication.SignOut(); 
      var ticket = new FormsAuthenticationTicket(1, user.UserName, DateTime.Now.AddMinutes(30), expires, alse, null); 
      var encryptedTicket = FormsAuthentication.Encrypt(ticket); 
      var authCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket) 
      { 
       Expires = ticket.Expiration 
      }; 

      httpContextProvider.GetCurrentHttpContext().Response.Cookies.Add(authCookie); 
     } 

    public void SignOut() 
    { 
     FormsAuthentication.SignOut(); 
    } 

Utilizo mi propio objeto de usuario y las tablas. Guardo mis contraseñas hash en la lista de uso con una sal única por usuario. Esto es seguro, fácil de implementar y cabrá en su diseño. Su tabla de base de datos no estará contaminada por la basura del proveedor de membresía de Microsofts.

+0

¿Por qué haces todo esto? ¿Hay alguna ventaja al hacer esto al llamar a FormsAuthentication.SetAuthCookie? (que hace todo lo que acaba de hacer manualmente iirc) – mattlant

+0

O redirigir desde LogPágina para el caso. Ambos configuran la cookie sin utilizar ninguna de las publicaciones fraudulentas de la membresía de MS – mattlant

+0

. Puedo establecer manualmente el tiempo de caducidad, usar mi propio modelo a seguir sin usar el membershipProvider. Además de eso, el código anterior está copiado y pegado desde una clase Authenticator: IAuthenticator con un httpcontext inyectado. – Paco

3

Saltear es la práctica de agregar una secuencia de caracteres independientes a lo que se está procesando. Supongamos mySalt = abc123 y mi contraseña es passwd. En PHP, usaría hashResult = md5(mySalt + password).

Supongamos que se intercepta la cadena. Intenta hacer coincidir la cadena, pero termina emparejando galimatías porque la contraseña fue salada antes de encriptarse. Solo recuerda que cualquier cosa que uses para la sal debe ser continua durante toda la aplicación. Si salta la contraseña antes de almacenarla, debe comparar la contraseña hash y salada con la base de datos.

1

Puede utilizar el proveedor integrado de membresía SQL, y puede configurar una base de datos dedicada de "acceso de usuario" si no desea las tablas de membresía .Net dentro de su base de datos; solo especifíquelo en la cadena de conexión.

La ventaja de que el modelo de proveedor es a nivel de aplicación, el código es independiente del almacén de autenticación particular que haya utilizado.

Hay una buena serie de tutirials en el sitio asp.net:

link text