Cuando una aplicacion deja de funcionar, por la conexion a la BD

El otro día estaba revisando una aplicación, que inexplicablemente dejo de funcionar el acceso a datos. No se mostraba nada en la portada, no había información, -chess… nos hackearon. Pero revisando la base de datos todo estaba bien, toda la información estaba como debería estar. Era una aplicación Web de terceros, revise la configuración del proveedor de acceso a datos, y entre una de las configuraciones que era SQL Server, me decía que no se podía establecerla conexión, sin más detalles. Pero la base de datos estaba online y funcionando correctamente, comencé  a indagar cuales fueron los últimos cambios, si se instalaron add-ins, o se cambio alguna configuración, y nada.

Para la conexión estaba usando un login SQL, así que entre con ese usuario por el SQL Server Management Studio, y el mensaje fue clarísimo:

SQL Server 2005 - Your password is expired.

You password is expired. You must enter another password before you can log on”.

Y esto debido que durante la creación del usuario marcaron la opción, “Enforce password expiration“:

SQL Server 2005 - Enforce password expiration

Cabe resaltar que esta feature de SQL Server 2005 sólo funciona sobre Windows Server 2003 (imagino que W2k8 también debe funcionar).

La recomendación es activar esta opción, por medidas de seguridad. Pero imagino que cada organización tendrá sus propias políticas. Pero vamos al tema, que pasa si habilito la opción, que recomendaciones se debe tener en la aplicación.

¿Dónde cambiamos el número de días de expiración?

Pues usa la misma política que las cuentas de Windows. Nos vamos Herramientas administrativas, e ingresamos a Local Security Policy. Dentro de Account Policies -> Password Policy, cambiamos los días para la edad máxima del password.

http://sergiot2.com/blogimages/2008/06Jun/12_LocalPolicy.jpg

Nota: Estas son las configuraciones por defecto, no la tomen como ejemplo, aún no soy el indicado para hablar de estos temas, todavía no me han dado completamente un server para jugar (6). Artículo relacionado al tema: SQL Server 2005 Login Properties to Enforce Password Policies and Password Expiration.

¿Y cómo le digo a la aplicación que cambie el password?

Pues el administrador debería tenerlo agendado en el Outlook con un reminder de un par de días. Pues si no pasa esto, podemos activar alertas programáticamente, para notificar ante la necesidad de cambiar la cadena de conexión.

   1: static void Main(string[] args)
   2:    {
   3:      String cn = "data source=192.168.1.8; database=northwind; uid=tinysa; pwd=password";
   4:  
   5:      using (SqlConnection sql = new SqlConnection(cn))
   6:      {
   7:        using (SqlCommand cmd = new SqlCommand(
   8:                        "SELECT * FROM Customers WHERE CompanyName LIKE 'a%'",
   9:                        sql))
  10:        {
  11:          try
  12:          {
  13:            sql.Open();
  14:            SqlDataReader rd = cmd.ExecuteReader();
  15:  
  16:            Console.Write("Customers: ");
  17:            while (rd.Read())
  18:            {
  19:              Console.WriteLine("{0}, ", rd["CompanyName"]);
  20:            }
  21:  
  22:            sql.Close();
  23:          }
  24:          catch (SqlException sqlEx)
  25:          {
  26:            if (sqlEx.Number == 18487)
  27:            {
  28:              //send email, sms a webMaster.
  29:              Console.WriteLine("El password de la conexion ha expirado");
  30:            }
  31:          }
  32:          catch (Exception ex)
  33:          {
  34:            Console.WriteLine("hubo un error: {0}", ex.ToString());
  35:          }
  36:        }
  37:      }
  38:  
  39:      Console.ReadLine();
  40:  
  41:    }

NOTA: El ejemplo es didáctico, la cadena de conexión debería ser colocada en el archivo web.config, y este debería ser encriptado.

Notar que el código de Error de SQL de este mensaje es el número 18487, y si sucede este problema podemos enviarle un mensaje por msn, bloquearlo hasta que cambie la cadena de conexión y lo actualice en el web.config configurar para enviarle un email al encargado de la Web o Aplicación, notificándole lo sucedido.

Hay otros tipos de errores, que también podríamos considerar:

  • 15113 – Login failed for user ‘%.*ls’ Reason: Password validation failed. The account is locked out.
  • 18463 – Login failed for user ‘%.*ls’. Reason: Password change failed. The password cannot be used at this time.
  • 18464 – Login failed for user ‘%.*ls’. Reason: Password change failed. The password does not meet policy requirements because it is too short.
  • 18465 – Login failed for user ‘%.*ls’. Reason: Password change failed. The password does not meet policy requirements because it is too long.
  • 18466 – Login failed for user ‘%.*ls’. Reason: Password change failed. The password does not meet policy requirements because it is not complex enough.
  • 18467 – Login failed for user ‘%.*ls’. Reason: Password change failed. The password does not meet the requirements of the password filter DLL.
  • 18468 – Login failed for user ‘%.*ls’. Reason: Password change failed. An unexpected error occurred during password validation.
  • 18487 – Login failed for user ‘%.*ls’. Reason: The password of the account has expired.
  • 18488 – Login failed for user ‘%.*ls’. Reason: The password of the account must be changed.

Extraído de: Changing Passwords Programmatically. Imaginen que el administrador creo el user, y marco la opción cambiar el password la primera vez de login, y no lo haga y nos de esa password para conectarnos a la aplicación… hay casos….

Hay otra opción, y es cambiar el password a través de una página de administración. La clase SqlConnection, tiene un método llamado ChangePassword, para esta tarea. En esta referencia hay un código ejemplo, sólo hay que agregar la siguiente línea (la número 5):

   1: private static string ModifyConnectionString(
   2:        string connectionString, string NewPassword)
   3:    {
   4:      //AGREGAR ESTA LINEA
   5:      SqlConnection.ChangePassword(connectionString, NewPassword);
   6:  
   7:      // Use the SqlConnectionStringBuilder class to modify the
   8:      // password portion of the connection string. 
   9:      SqlConnectionStringBuilder builder =
  10:          new SqlConnectionStringBuilder(connectionString);
  11:      builder.Password = NewPassword;
  12:      return builder.ConnectionString;
  13:    }

Es como cambiarla usando el Sql Server Management Studio, y este código podríamos incluirlo dentro de las páginas de administración, ya que necesita que algún admin ingrese el nuevo password para el usuario.

Saludos,

4 comentarios en “Cuando una aplicacion deja de funcionar, por la conexion a la BD”

  1. hola, mira tengo un problema serio tengo un sistema basado en foxpro ok. staba bien pero ahora supuestamente no podemos grabar los datos pero reviso la DB y si esta pero quiero imprimir y no me muestra nada y me dice q no existe ?????

  2. Me alegro que haya quedado claro Alex.

    Erika, pues no he usado mucho Foxpro, casi nada. Ahora lo que no me queda claro es donde te da el problema, al parecer es en la Aplicación, si la base de datos existe y con consultas directas a través del motor, vez que no hay ningún problema, pero cuando ejecutas tu aplicación no ves nada, debe haber algún problema en el código de la aplicación.

    Saludos,

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *