public async void EnvioCorreo(TipoCorreo tipoCorreo)
        {
            var Ruta   = string.Empty;
            var Cadena = new String[] {
                string.Format("{0} {1} {2}", Nombres, ApellidoPaterno, ApellidoMaterno),
                Codigo,
                DateTime.Today.ToString("D"),
                DateTime.Today.AddDays(90).ToString("D")
            };

            var Contenido = new ContenidoMail();

            switch (tipoCorreo)
            {
            case TipoCorreo.UsuarioNuevoExterno:
                Ruta             = "ErickOrlando.Seguridad.Negocio.Editables.Usuarios.PlantillaCorreo.htm";
                Contenido.Asunto = string.Format(Properties.Resources.msgAsuntoActivacion, this.Codigo);
                break;

            case TipoCorreo.UsuarioNuevoInterno:
                Ruta             = "ErickOrlando.Seguridad.Negocio.Editables.Usuarios.PlantillaCorreoUsuarioAD.htm";
                Contenido.Asunto = string.Format(Properties.Resources.msgAsuntoActivacion, this.Codigo);
                Cadena           = new String[]
                {
                    Nombres,
                    Codigo,
                    Dominio
                };
                break;

            case TipoCorreo.CambioClave:
                Ruta             = "ErickOrlando.Seguridad.Negocio.Editables.Usuarios.PlantillaContrasena.htm";
                Contenido.Asunto = string.Format(Properties.Resources.msgAsuntoRestablecimiento, this.Codigo);
                break;
            }

            try
            {
                TextReader texto = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(Ruta));

                #region Configuracion del Correo
                var crypto = new SimpleInteroperableEncryption();

                Contenido.RemitenteMail   = ConfigurationManager.AppSettings["RemitenteEmail"];
                Contenido.RemitenteNombre = ConfigurationManager.AppSettings["RemitenteNombre"];
                Contenido.Servidor        = ConfigurationManager.AppSettings["SMTPServer"];
                Contenido.Puerto          = int.Parse(ConfigurationManager.AppSettings["PuertoSMTP"]);
                Contenido.Credenciales    = new System.Net.NetworkCredential(
                    crypto.Decrypt(ConfigurationManager.AppSettings["CredencialUser"]),
                    crypto.Decrypt(ConfigurationManager.AppSettings["CredencialPass"]));
                Contenido.UsarSSL       = true;
                Contenido.CuerpoMensaje = texto.ReadToEnd();
                Contenido.ListaDestinatarios.Add(Correo);
                Contenido.ArrayValores = Cadena;
                Contenido.Html         = true;
                texto.Close();
                #endregion

                #region Contenido del Correo
                using (MailMessage mail = new MailMessage())
                {
                    mail.From = new MailAddress(Contenido.RemitenteMail, Contenido.RemitenteNombre);
                    foreach (var Destinatario in Contenido.ListaDestinatarios)
                    {
                        mail.To.Add(Destinatario);
                    }
                    foreach (var Destinatario in Contenido.ListaDestinatariosCC)
                    {
                        mail.CC.Add(Destinatario);
                    }
                    foreach (var Destinatario in Contenido.ListaDestinatariosBCC)
                    {
                        mail.Bcc.Add(Destinatario);
                    }
                    var CuerpoHTML = new StringBuilder();

                    if (Contenido.ArrayValores.Length > 0)
                    {
                        CuerpoHTML.AppendFormat(Contenido.CuerpoMensaje, Contenido.ArrayValores);
                    }
                    else
                    {
                        CuerpoHTML.Append(Contenido.CuerpoMensaje);
                    }

                    CuerpoHTML.AppendLine();
                    CuerpoHTML.AppendLine();
                    CuerpoHTML.AppendLine();

                    CuerpoHTML.Append(Contenido.Html ? Contenido.PieDeCorreoHTML : Contenido.PieDeCorreo);

                    mail.Subject    = Contenido.Asunto;
                    mail.Body       = CuerpoHTML.ToString();
                    mail.IsBodyHtml = Contenido.Html;

                    //Limpiamos el StringBuilder
                    CuerpoHTML.Length = 0;

                    var smtp = new SmtpClient();
                    smtp.Host = Contenido.Servidor;
                    if (Contenido.Puerto.HasValue)
                    {
                        smtp.Port = Contenido.Puerto.Value;
                    }

                    if (Contenido.Credenciales != null)
                    {
                        smtp.Credentials = Contenido.Credenciales;
                    }
                    else
                    {
                        smtp.UseDefaultCredentials = true;
                    }

                    if (Contenido.Servidor.ToLower() == "localhost" || Contenido.Servidor == "127.0.0.1")
                    {
                        smtp.DeliveryMethod = SmtpDeliveryMethod.PickupDirectoryFromIis;
                    }

                    if (!string.IsNullOrEmpty(Contenido.DirectorioRecojoIIS))
                    {
                        smtp.PickupDirectoryLocation = Contenido.DirectorioRecojoIIS;
                    }

                    smtp.EnableSsl = Contenido.UsarSSL;

                    //await smtp.SendMailAsync(mail);
                    await smtp.SendMailAsync(mail);
                }
                #endregion
            }
            catch (SmtpException ex)
            {
                var msg = string.Format("{0}\n{1}",
                                        ex.Message, ex.InnerException == null ? string.Empty : ex.InnerException.Message);
                System.Diagnostics.Trace.WriteLine(msg);
            }
        }
예제 #2
0
        public static ResponseUsuarioInsert InsertUsuario(RequestDTOUsuarioInsert request)
        {
            ResponseUsuarioInsert result = new ResponseUsuarioInsert();
            var perfil  = ErickOrlando.Seguridad.Negocio.Editables.PerfilUsuario.NewPerfilUsuario();
            var usuario = Usuario.NewUsuario();

            try
            {
                if (String.IsNullOrEmpty(request.Codigo))
                {
                    return(result);
                }


                string IdAplicacion         = string.Empty;
                string IdEmpresa            = string.Empty;
                string IdEmpresaPertenencia = string.Empty;
                string IdRol   = string.Empty;
                string IdCargo = string.Empty;

                using (var ctx = new SeguridadEntities())
                {
                    // Buscamos el ID de la Aplicacion.
                    IdAplicacion = (from app in ctx.Aplicaciones
                                    where app.Acronimo == request.Acronimo
                                    select app.IdAplicacion).SingleOrDefault();

                    if (string.IsNullOrEmpty(IdAplicacion))
                    {
                        throw new ApplicationException(string.Format("La Aplicación {0} no existe!", request.Acronimo));
                    }

                    // Buscamos el ID de la Empresa.
                    IdEmpresa = (from emp in ctx.Empresas
                                 where emp.RUC == request.RUCEmpresa
                                 select emp.IdEmpresa).SingleOrDefault();

                    if (string.IsNullOrEmpty(IdEmpresa))
                    {
                        throw new ApplicationException(string.Format("La Empresa con el RUC {0} no existe!", request.RUCEmpresa));
                    }

                    if (request.RUCEmpresa != request.RUCEmpresaPertenencia)
                    {
                        // Buscamos el ID de la Empresa Pertenencia.
                        IdEmpresaPertenencia = (from emp in ctx.Empresas
                                                where emp.RUC == request.RUCEmpresaPertenencia
                                                select emp.IdEmpresa).SingleOrDefault();

                        if (string.IsNullOrEmpty(IdEmpresaPertenencia))
                        {
                            throw new ApplicationException(string.Format("La Empresa con el RUC {0} no existe!", request.RUCEmpresaPertenencia));
                        }
                    }
                    else
                    {
                        IdEmpresaPertenencia = IdEmpresa;
                    }

                    // Buscamos el ID del Rol.
                    IdRol = (from roles in ctx.Roles
                             where roles.IdAplicacion == IdAplicacion &&
                             roles.NombreRol == request.Rol
                             select roles.IdRol).SingleOrDefault();

                    if (string.IsNullOrEmpty(IdRol))
                    {
                        throw new ApplicationException(string.Format("No se encuentra el Rol {0}", request.Rol));
                    }

                    // Buscamos el ID del Cargo.
                    IdCargo = (from cargo in ctx.Cargo
                               where cargo.Descripcion == request.Cargo
                               select cargo.IdCargo).SingleOrDefault();

                    if (string.IsNullOrEmpty(IdCargo))
                    {
                        throw new ApplicationException(string.Format("No se encuentra el cargo {0}", request.Cargo));
                    }


                    ctx.Database.Connection.Close();
                }

                //Creacion de nuevo usuario
                usuario.IdEmpresa            = IdEmpresa;
                usuario.IdEmpresaPertenencia = IdEmpresaPertenencia;
                usuario.IdCargo            = IdCargo;
                usuario.Nombres            = request.Nombres;
                usuario.Alias              = request.Alias;
                usuario.Dominio            = request.Dominio;
                usuario.ApellidoMaterno    = request.ApellidoMaterno;
                usuario.ApellidoPaterno    = request.ApellidoPaterno;
                usuario.Codigo             = request.Codigo;
                usuario.Correo             = request.Correo;
                usuario.DNI                = request.DNI;
                usuario.Estado             = true;
                usuario.NotificarConCorreo = request.NotificacionConCorreo;
                usuario.Tipo               = request.Tipo;
                usuario = usuario.Save();


                //Recuperando usuario creado
                var usuarioCreado = usuario;

                //Estableciendo variables de entorno
                Csla.ApplicationContext.GlobalContext["Placa"]   = Environment.MachineName;
                Csla.ApplicationContext.GlobalContext["Usuario"] = Environment.UserName;



                //Creacion de perfil


                perfil.IdAplicacion   = IdAplicacion;
                perfil.IdUsuario      = usuarioCreado.Id;
                perfil.Usuario        = usuarioCreado.Nombres;
                perfil.Aplicacion     = IdAplicacion;
                perfil.Caduca         = request.Caduca;
                perfil.VigenciaInicio = DateTime.Now;
                perfil.VigenciaFin    = DateTime.Now.AddYears(1);

                //Asignando rol
                var rolPerfil = perfil.RolesPerfiles.AddNew();

                rolPerfil.IdRol        = IdRol;
                rolPerfil.IdAplicacion = IdAplicacion;

                //Agregando permisos
                rolPerfil.AgregarPermisos();

                //Estableciendo recursos
                var recursosList = RecursosInfoList.GetRecursosInfoList();

                if (request.ListaRecursos != null)
                {
                    foreach (var recurso in request.ListaRecursos)
                    {
                        string   recursoact     = recurso.Substring(0, recurso.IndexOf(":")).Trim();
                        string[] recursodetalle = recurso.Substring(recurso.IndexOf(":") + 1).Trim().Split(',');

                        foreach (var itemrecurso in recursosList.Where(x => x.Descripcion == recursoact))
                        {
                            var recursodetalles = from p in itemrecurso.Detalles
                                                  where recursodetalle.Contains(p.Descripcion)
                                                  select p;

                            foreach (var itemrecursodetalle in recursodetalles)
                            {
                                var recursoitem = perfil.Recursos.AddNew();
                                recursoitem.Conceder         = true;
                                recursoitem.IdRecursoDetalle = itemrecursodetalle.ID;
                                perfil.Recursos.Add(recursoitem);
                            }
                        }
                    }
                }

                perfil.Save();

                string Clave = string.Empty;

                if (usuario.Tipo == "E")
                {
                    //Creacion de contraseña
                    if (String.IsNullOrEmpty(request.Clave))
                    {
                        Clave = GenerarClaveAleatoria();
                    }
                    else
                    {
                        var crypto = new SimpleInteroperableEncryption();
                        Clave = crypto.Decrypt(request.Clave);
                    }
                    //Hay que intentar el Login para identificar si se debe crear la contraseña.

                    try
                    {
                        Csla.ApplicationContext.GlobalContext["Acronimo"] = request.Acronimo;

                        GRPrincipal.Load(usuario.Codigo, usuario.Dominio);

                        //GRPrincipal.Login(usuario.Codigo, GRCrypto.Encriptar( "clave"));
                    }
                    catch (DataPortalException ex)
                    {
                        if (ex.BusinessException.GetType() == typeof(UsuarioNoActivoException) ||
                            ex.BusinessException.GetType() == typeof(UsuarioSinClaveException))
                        {
                            var activacion = ActivarUsuario.GetActivarUsuario(new FiltroUsuarios
                            {
                                Usuario = usuario.Codigo,
                                Dominio = usuario.Dominio
                            });

                            activacion.NombreUsuario    = request.Codigo;
                            activacion.PreguntaSecreta  = request.PreguntaSecreta;
                            activacion.RespuestaSecreta = request.RespuestaSecreta;
                            activacion.ClaveSecreta     = Clave;
                            activacion.ConfirmarClave   = Clave;

                            try
                            {
                                activacion.Save();
                            }
                            catch (ValidationException)
                            {
                                throw new InvalidOperationException(activacion.BrokenRulesCollection.ToString());
                            }
                        }
                    }
                }
                result.IdUsuario         = usuarioCreado.Id;
                result.Clave             = (string.IsNullOrEmpty(request.Clave)) ? Clave : string.Empty;
                result.Codigo            = request.Codigo;
                result.Alias             = request.Alias;
                result.Resultado.Success = true;
                result.Resultado.Message = string.Empty;
            }
            catch (ValidationException)
            {
                var msg1 = usuario.BrokenRulesCollection.ToString();
                var msg2 = perfil.BrokenRulesCollection.ToString();
                if (string.IsNullOrEmpty(msg1))
                {
                    result.Resultado.Message = msg2;
                }
                else if (string.IsNullOrEmpty(msg2))
                {
                    result.Resultado.Message = msg1;
                }
                else
                {
                    result.Resultado.Message = string.Format("{0} {1}", msg1, msg2);
                }
            }
            catch (DataPortalException ex)
            {
                result.Resultado.Message = ex.BusinessException.Message;
                if (ex.BusinessException.InnerException != null)
                {
                    result.Resultado.Messages.Add(new Result {
                        Message = ex.BusinessException.InnerException.Message
                    });
                }
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                if (ex.InnerException != null)
                {
                    msg = ex.InnerException.Message;
                }
                result.Resultado.Message = msg;
            }
            return(result);
        }
예제 #3
0
        /// <summary>
        /// Cambia la contraseña de un usuario externo, si el campo es vacio se crea una contraseña, de lo contrario registra al constraseña enviada.
        /// </summary>
        /// <param name="request">Constraseña a registrar</param>
        /// <returns>Contraseña generada</returns>
        public static ResponseCambioClave CambiarClaveWeb(RequestCambioClave request)
        {
            ResponseCambioClave response = new ResponseCambioClave();
            var publicCrypter            = new SimpleInteroperableEncryption();

            var info = GetInfoBasicaUsuariosByCodigo(new RequestInfoBasicaUsuarioDTO
            {
                CodigoUsuario = request.CodigoUsuario,
                Dominio       = request.Dominio
            });

            if (!info.Resultado.Success)
            {
                throw new InvalidOperationException("El usuario no existe!");
            }

            if (info.InfoBasica.Tipo != "E")
            {
                throw new InvalidOperationException("Sólo los usuarios externos pueden cambiar su contraseña");
            }

            //SI SE HA SOLICITADO CONTRASEÑA, SE VALIDA LA CONTRASEÑA ANTIGUA
            if (request.TipoCambioClave == TipoCambioClave.Ui)
            {
                // Comprobamos si el campo de Respuesta Secreta se encuentra lleno para validar
                // que el usuario se olvidó se contraseña y posteriormente hacer el cambio.
                if (string.IsNullOrEmpty(request.RespuestaSecreta))
                {
                    ResponseLoginUsuario responseLogin = Login(new RequestLogin
                    {
                        CodigoUsuario      = request.CodigoUsuario,
                        Clave              = publicCrypter.Decrypt(request.ClaveAntigua),
                        Dominio            = request.Dominio,
                        AcronimoAplicacion = request.Acronimo
                    });

                    if (!responseLogin.Resultado.Success)
                    {
                        throw new Exception("La contraseña es incorrecta.");
                    }
                }
                else
                {
                    // Comprobamos que la respuesta a la pregunta Secreta sea válida.
                    using (var ctx = new SeguridadEntities())
                    {
                        var clave = (from clav in ctx.Claves
                                     where clav.IdUsuario == info.InfoBasica.IdUsuario &&
                                     clav.Ultimo
                                     select new { RespuestaSecreta = clav.Respuesta }).FirstOrDefault();
                        if (clave != null)
                        {
                            if (clave.RespuestaSecreta != GRCrypto.Encriptar(request.RespuestaSecreta))
                            {
                                throw new SecurityException("La respuesta secreta no coincide!");
                            }
                        }
                    }
                }
            }

            // En caso sea un reseteo de clave
            if (request.TipoCambioClave == TipoCambioClave.Sys)
            {
                request.ClaveAntigua = request.ClaveNuevaConfirmada = request.ClaveNueva = publicCrypter.Decrypt(request.ClaveNueva);
            }
            else
            {
                //DESENCRIPTAR LA CONTRASENIA
                request.ClaveAntigua         = publicCrypter.Decrypt(request.ClaveAntigua);
                request.ClaveNueva           = publicCrypter.Decrypt(request.ClaveNueva);
                request.ClaveNuevaConfirmada = publicCrypter.Decrypt(request.ClaveNuevaConfirmada);
            }

            Result result = ValidacionCambiarClaveWeb(request);

            if (result.Success == false)
            {
                throw new Exception(result.Message);
            }

            bool primeraClave = false;

            try
            {
                //Validamos si tiene Clave registrada.
                GRPrincipal.Load(request.CodigoUsuario, request.Dominio);
            }
            catch (DataPortalException ex)
            {
                if (ex.BusinessException != null)
                {
                    if (ex.BusinessException.GetType() == typeof(UsuarioSinClaveException))
                    {   //SI LA EXCEPCION ES USUARIOSINCLAVE SE LE CREA UNA CLAVE
                        ActivarUsuario activarUsuario = ActivarUsuario.GetActivarUsuario(new FiltroUsuarios
                        {
                            Usuario = request.CodigoUsuario, Dominio = request.Dominio
                        });

                        activarUsuario.PreguntaSecreta = activarUsuario.RespuestaSecreta = request.CodigoUsuario;
                        activarUsuario.ClaveSecreta    = activarUsuario.ConfirmarClave = request.ClaveNueva;

                        activarUsuario.Save();
                        primeraClave = true;
                    }
                }
            }

            if (!primeraClave)
            {
                var cambiarClave = CambiarClave.GetCambiarClave(new FiltroUsuarios
                {
                    Usuario = request.CodigoUsuario, Dominio = request.Dominio
                });
                cambiarClave.ClaveNueva       = cambiarClave.ConfirmarClave = request.ClaveNueva;
                cambiarClave.RespuestaSecreta = string.IsNullOrEmpty(request.RespuestaSecreta)
                        ? cambiarClave.SecretAnswer : request.RespuestaSecreta;
                CambiarClave.ByPassClave = true;
                cambiarClave.Save();
            }

            response.Correo        = info.InfoBasica.Correo;
            response.Nombres       = info.InfoBasica.NombresCompletos;
            response.CodigoUsuario = request.CodigoUsuario;

            return(response);
        }
예제 #4
0
        public static ResponseLoginUsuario Login(RequestLogin request)
        {
            var response = new ResponseLoginUsuario();

            try
            {
                if (string.IsNullOrEmpty(request.Clave) || string.IsNullOrEmpty(request.CodigoUsuario))
                {
                    throw new InvalidOperationException("El usuario y clave son obligatorios.");
                }
                if (string.IsNullOrEmpty(request.AcronimoAplicacion))
                {
                    throw new InvalidOperationException("El acrónimo es obligatorio.");
                }

                // Desencriptamos el mensaje recibido.
                var cryptocon = new SimpleInteroperableEncryption();
                request.Clave = cryptocon.Decrypt(request.Clave);

                //Comprobamos que el Nombre de Usuario contiene un Dominio
                var infoUser = new UserDomain {
                    Usuario = request.CodigoUsuario, Dominio = request.Dominio
                };
                //Guardamos en el GlobalContext el valor que se reciba del Acrónimo
                Csla.ApplicationContext.GlobalContext["Acronimo"] = request.AcronimoAplicacion;
                if (string.IsNullOrEmpty(request.Dominio))
                {
                    throw new InvalidOperationException("El dominio es obligatorio.");
                }

                var result = false;

                //Comprobamos primero el tipo de Usuario
                if (GRPrincipal.Load(infoUser.Usuario, infoUser.Dominio))
                {
                    InfoUsuario.Initialize();
                    if (InfoUsuario.Instancia.Tipo) // Si es interno
                    {
                        result = GRPrincipal.Login(infoUser.Usuario, request.Clave, request.Dominio);
                    }
                    else // Si es externo
                    {
                        result = GRPrincipal.Login(infoUser.Usuario, GRCrypto.Encriptar(request.Clave));
                    }
                }
                else
                {
                    throw new InvalidOperationException("El usuario no está inscrito para este Sistema");
                }

                if (!result)
                {
                    throw new SecurityException("El usuario o clave no son válidos!");
                }

                response.Resultado.Success = result;
                response.IdPerfilUsuario   = InfoUsuario.Instancia.IdPerfilUsuario;
            }
            catch (DataPortalException ex)
            {
                response.Resultado.Message = ex.BusinessException.Message;
            }
            catch (Exception ex)
            {
                var msg = ex.Message;
                if (ex.InnerException != null)
                {
                    msg = ex.InnerException.Message;
                }
                response.Resultado.Message = msg;
            }

            return(response);
        }