/// <summary>
        ///Agrega un nuevo usuario al origen de datos.
        /// </summary>
        /// <param name="username">Nick del nuevo usuario.</param>
        /// <param name="password">Contraseña del nuevo usuario.</param>
        /// <param name="email">Email del usuario nuevo.</param>
        /// <param name="passwordQuestion">Pregunta de contraseña del nuevo usuario.</param>
        /// <param name="passwordAnswer">Respuesta de la pregunta del nuevo usuario</param>
        /// <param name="isApproved">Si el nuevo usuario está o no aprobado para ser valido</param>
        /// <param name="providerUserKey">El identificador único del usuario.</param>
        /// <param name="status">A <see cref="T:System.Web.Security.MembershipCreateStatus" /> valor de enumeración que indica si el usuario se creó correctamente.</param>
        /// <returns>
        /// A <see cref="T:System.Web.Security.MembershipUser" /> objeto con la información para el usuario recién creado.
        /// </returns>
        public override MembershipUser CreateUser(string username,
                                                  string password,
                                                  string email,
                                                  string passwordQuestion,
                                                  string passwordAnswer,
                                                  bool isApproved,
                                                  object providerUserKey,
                                                  out MembershipCreateStatus status)
        {
            FonadeUser u = (FonadeUser)GetUser(username, false);

            if (u == null)
            {
                try
                {
                    db.CrearContacto(username, password, email);
                    status = MembershipCreateStatus.Success;
                }
                catch (Exception)
                {
                    status = MembershipCreateStatus.UserRejected;
                }

                return(GetUser(username, true));
            }
            else
            {
                status = MembershipCreateStatus.DuplicateUserName;
            }
            return(null);
        }
        /// <summary>
        /// Obtiene información del origen de datos para un usuario. Proporciona una opción para actualizar la fecha / hora de última actividad para el usuario.
        /// </summary>
        /// <param name="username">El nombre del usuario para obtener información .</param>
        /// <param name="userIsOnline">true para actualizar la fecha / hora de última actividad para el usuario; false para devolver la información del usuario sin actualizar la fecha / hora de última actividad para el usuario.</param>
        /// <returns>
        /// A <see cref="T:System.Web.Security.MembershipUser" /> objeto con la información del usuario especificado del origen de datos.
        /// </returns>
        public override MembershipUser GetUser(string username, bool userIsOnline)
        {
            ObjectCache cache   = MemoryCache.Default;
            FonadeUser  usuario = (FonadeUser)cache[string.Format("FonadeUser-{0}", username)];

            if (usuario == null || !userIsOnline)
            {
                CacheItemPolicy policy = new CacheItemPolicy();
                policy.AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(5.0);

                UsuarioFonade contacto = db.GetContacto(username);
                if (contacto == null)
                {
                    return(null);
                }
                usuario = new FonadeUser("FonadeMembershipProvider",
                                         contacto.Email,
                                         null,
                                         contacto.Email,
                                         null,
                                         "",
                                         true,
                                         false,
                                         contacto.FechaCreacion,
                                         DateTime.Now,
                                         DateTime.Now,
                                         contacto.FechaCambioClave,
                                         DateTime.Now,
                                         contacto.Nombres,
                                         contacto.Apellidos,
                                         contacto.CodGrupo,
                                         contacto.IdContacto,
                                         contacto.CodInstitucion,
                                         contacto.Identificacion,
                                         contacto.Clave,
                                         contacto.AceptoTerminosYCondiciones,
                                         contacto.CodOperador,
                                         null
                                         );
                cache.Set(string.Format("FonadeUser-{0}", username), usuario, policy);
            }

            return(usuario);
        }