PageRenderTime 74ms CodeModel.GetById 20ms app.highlight 46ms RepoModel.GetById 1ms app.codeStats 1ms

/Docs/07-Implementacion/Source/trunk/EDUAR_Regular/EDUAR/EDUAR_DataAccess/Security/DASeguridad.cs

http://blpm.googlecode.com/
C# | 496 lines | 412 code | 45 blank | 39 comment | 25 complexity | c8b0a31c2574e4977763bf4fe7cb36f6 MD5 | raw file
  1using System;
  2using System.Collections.Generic;
  3using System.Data;
  4using System.Data.SqlClient;
  5using System.Text;
  6using System.Web.Security;
  7using EDUAR_DataAccess.Shared;
  8using EDUAR_Entities.Security;
  9using EDUAR_Utility.Enumeraciones;
 10using EDUAR_Utility.Excepciones;
 11
 12namespace EDUAR_DataAccess.Security
 13{
 14	/// <summary>
 15	/// Clase que contiene la logica de acceso a datos de Seguridad. 
 16	/// </summary>
 17	public class DASeguridad
 18	{
 19		#region --[Atributos]--
 20		public DATransaction transaction;
 21		private const string ClassName = "DASeguridad";
 22		#endregion
 23
 24		#region --[Constructores]--
 25		/// <summary>
 26		/// Contructor que setea la conexion a 
 27		/// </summary>
 28		public DASeguridad()
 29		{
 30			transaction = new DATransaction("ApplicationServices");
 31		}
 32
 33		protected DASeguridad(DATransaction objDATransaction)
 34		{
 35			transaction = objDATransaction;
 36		}
 37		#endregion
 38
 39		#region --[Métodos Publicos]--
 40		public void CrearUsuarios(DTSeguridad objDTSeguridad)
 41		{
 42			string Nombre = string.Empty;
 43			try
 44			{
 45				//Obtener el password por defecto
 46				DAConfiguracionGlobal objDAConfiguracionGlobal = new DAConfiguracionGlobal();
 47				string password = objDAConfiguracionGlobal.GetConfiguracion(enumConfiguraciones.PasswordInicial);
 48				int i = 0;
 49
 50				foreach (DTUsuario objUsuarios in objDTSeguridad.ListaUsuarios)
 51				{
 52					objDTSeguridad.ListaUsuarios[i].Password = password;
 53					objDTSeguridad.ListaUsuarios[i].Aprobado = true;
 54					i++;
 55				}
 56
 57				try
 58				{
 59					foreach (DTUsuario objUsuario in objDTSeguridad.ListaUsuarios)
 60					{
 61						#region [Usuarios]
 62
 63						//Crea el nuevo usuario
 64						System.Web.Security.MembershipCreateStatus status;
 65						System.Web.Security.MembershipUser newUser;
 66
 67						newUser = System.Web.Security.Membership.CreateUser(objUsuario.Nombre, objUsuario.Password, objUsuario.Email, objUsuario.PaswordPregunta, objUsuario.PaswordRespuesta, objUsuario.Aprobado, out status);
 68
 69						//Valida el estado del usuario creado.
 70						if (newUser == null)
 71						{
 72							switch (status)
 73							{
 74								case System.Web.Security.MembershipCreateStatus.DuplicateUserName:
 75									EliminarUsuarios(objDTSeguridad, Nombre);
 76									throw new CustomizedException("El usuario " + objUsuario.Nombre + " ya existe, la operación ha sido cancelada.", null, enuExceptionType.ValidationException);
 77								case System.Web.Security.MembershipCreateStatus.InvalidPassword:
 78									EliminarUsuarios(objDTSeguridad, Nombre);
 79									throw new CustomizedException("La Contraseńa para el usuario " + objUsuario.Nombre + " es invalida, la operación ha sido cancelada.", null,
 80																  enuExceptionType.ValidationException);
 81								case System.Web.Security.MembershipCreateStatus.InvalidUserName:
 82									EliminarUsuarios(objDTSeguridad, Nombre);
 83									throw new Exception("El nombre del usuario " + objUsuario.Nombre + " es invalido, la operación ha sido cancelada.");
 84								default:
 85									EliminarUsuarios(objDTSeguridad, Nombre);
 86									throw new CustomizedException("No se pudo crear el usuario " + objUsuario.Nombre + ", la operación ha sido cancelada.", null,
 87																  enuExceptionType.ValidationException);
 88							}
 89						}
 90
 91						#endregion
 92
 93						Nombre = objUsuario.Nombre.ToString();
 94
 95						#region [Roles]
 96						string sTodosRoles = string.Empty;
 97						string[] sRoles = new string[objUsuario.ListaRoles.Count];
 98						try
 99						{
100							//Agrega el usuario a los Roles que se le definieron.
101							foreach (DTRol rolUsuario in objUsuario.ListaRoles)
102							{
103								if (rolUsuario.Nombre.ToString() != string.Empty && Roles.RoleExists(rolUsuario.Nombre.ToString()))
104									Roles.AddUserToRole(objUsuario.Nombre, rolUsuario.Nombre);
105								else
106								{
107									EliminarUsuarios(objDTSeguridad, Nombre);
108									Exception ex = new CustomizedException("No se pudieron agregar los roles para El usuario " + Nombre + ", la operación ha sido cancelada.", null, enuExceptionType.ValidationException);
109									throw ex;
110								}
111							}
112						}
113						catch (Exception ex)
114						{
115							throw ex;
116						}
117						#endregion
118					}
119				}
120				catch (Exception ex)
121				{
122					throw ex;
123				}
124			}
125			catch (CustomizedException ex)
126			{
127				throw ex;
128			}
129			catch (Exception ex)
130			{
131				throw new CustomizedException(ex.Message, null,
132											  enuExceptionType.ValidationException);
133			}
134		}
135
136		private void EliminarUsuarios(DTSeguridad objDTSeguridad, string Nombre)
137		{
138			try
139			{
140				foreach (DTUsuario objUsuarioDelete in objDTSeguridad.ListaUsuarios)
141				{
142
143					if (objUsuarioDelete.Nombre.ToString() != string.Empty && Membership.FindUsersByName(objUsuarioDelete.Nombre.ToString()).Count > 0)
144					{
145						foreach (DTRol rolUsuario in objUsuarioDelete.ListaRoles)
146						{
147							if (rolUsuario.Nombre.ToString() != string.Empty && Roles.RoleExists(rolUsuario.Nombre.ToString()))
148								Roles.RemoveUserFromRole(objUsuarioDelete.Nombre, rolUsuario.Nombre);
149						}
150						Membership.DeleteUser(objUsuarioDelete.Nombre, true);
151					}
152					if (Nombre == objUsuarioDelete.Nombre)
153						return;
154				}
155			}
156			catch (Exception ex)
157			{
158				throw ex;
159			}
160		}
161		/// <summary>
162		/// Método que obtiene la lista de Roles de la aplicacion
163		/// </summary>  
164		/// <param name="objDTSeguridad">DTO con los parametros dentro</param>
165		/// <returns>Lista con los roles</returns>
166		public List<DTRol> GetRoles(DTSeguridad objDTSeguridad)
167		{
168			string rolesParam = string.Empty;
169			try
170			{
171				string query = @"SELECT 
172                                             ROL.RoleId
173                                            ,ROL.RoleName
174                                            ,ROL.LoweredRoleName
175                                            ,ROL.Description
176                                        FROM
177                                            aspnet_Roles			AS ROL
178                                            INNER JOIN
179                                            aspnet_Applications AS APP
180                                            ON 
181                                            ROL.ApplicationId = APP.ApplicationId 
182                                        WHERE 
183	                                        APP.ApplicationName = @ApplicationName";
184
185				if (objDTSeguridad.ListaRoles.Count != 0)
186				{
187					foreach (DTRol rol in objDTSeguridad.ListaRoles)
188						rolesParam += string.Format("'{0}',", rol.Nombre);
189
190					rolesParam = rolesParam.Substring(0, rolesParam.Length - 1);
191					query = string.Format("{0} AND ROL.RoleName IN ({1})", query, rolesParam);
192				}
193
194				transaction.DBcomand = transaction.DataBase.GetSqlStringCommand(query);
195
196				// Ańadir parámetros
197				transaction.DataBase.AddInParameter(transaction.DBcomand, "@ApplicationName", DbType.String, objDTSeguridad.Aplicacion);
198
199				IDataReader reader = transaction.DataBase.ExecuteReader(transaction.DBcomand);
200				List<DTRol> listaRoles = new List<DTRol>();
201				while (reader.Read())
202				{
203					DTRol rol = new DTRol()
204					{
205						RoleId = reader["RoleId"].ToString(),
206						Descripcion = reader["Description"].ToString(),
207						Nombre = reader["RoleName"].ToString(),
208						NombreCorto = reader["LoweredRoleName"].ToString()
209					};
210					listaRoles.Add(rol);
211				}
212				return listaRoles;
213			}
214			catch (SqlException ex)
215			{
216				throw new CustomizedException(string.Format("Fallo en {0} - GetRoles()", ClassName),
217													   ex, enuExceptionType.SqlException);
218			}
219			catch (Exception ex)
220			{
221				throw new CustomizedException(string.Format("Fallo en {0} - GetRoles()", ClassName),
222													   ex, enuExceptionType.DataAccesException);
223			}
224		}
225
226		/// <summary>
227		/// Método que obtiene la lista de usuarios de la aplicacion
228		/// </summary>  
229		/// <param name="objDTSeguridad">DTO con los parametros dentro</param>
230		/// <param name="paginar"></param>
231		/// <returns>Lista de usuarios.</returns>
232		public DTSeguridad GetUsuarios(DTSeguridad objDTSeguridad, Boolean paginar)
233		{
234			// DSUsuarios.UsersDataTable dt = new DSUsuarios.UsersDataTable();
235			string rolesParam = string.Empty;
236			try
237			{
238				string query = @"SELECT DISTINCT
239                                            US.ApplicationId
240                                            ,US.UserId
241                                            ,US.UserName
242                                            ,US.LoweredUserName
243                                            ,US.MobileAlias
244                                            ,US.IsAnonymous
245                                            ,US.LastActivityDate
246                                            ,MEM.IsApproved
247                                        FROM 
248	                                        aspnet_Users AS US 
249	                                        INNER JOIN 
250	                                        aspnet_Applications AS APP
251	                                        ON US.ApplicationId = APP.ApplicationId
252	                                        INNER JOIN aspnet_Membership AS MEM
253	                                        ON US.UserId = MEM.UserId
254                                            LEFT JOIN aspnet_UsersInRoles AS USR
255	                                        ON US.UserId = USR.UserId
256	                                        LEFT JOIN aspnet_Roles AS R
257	                                        ON USR.RoleId = R.RoleId
258                                        WHERE
259	                                        APP.ApplicationName = @ApplicationName
260                                            AND
261                                            (@UserName IS NULL OR @UserName = '' OR UserName LIKE @UserName )
262                                            AND
263                                            (@IsApproved IS NULL OR @IsApproved = IsApproved )";
264
265				if (objDTSeguridad.ListaRoles.Count != 0)
266				{
267					foreach (DTRol rol in objDTSeguridad.ListaRoles)
268						rolesParam += string.Format("'{0}',", rol.Nombre);
269
270					rolesParam = rolesParam.Substring(0, rolesParam.Length - 1);
271					query = string.Format("{0} AND R.RoleName IN ({1})", query, rolesParam);
272				}
273
274				transaction.DBcomand = transaction.DataBase.GetSqlStringCommand(query);
275
276				// Ańadir parámetros
277				transaction.DataBase.AddInParameter(transaction.DBcomand, "@ApplicationName", DbType.String, objDTSeguridad.Aplicacion);
278				transaction.DataBase.AddInParameter(transaction.DBcomand, "@UserName", DbType.String, objDTSeguridad.Usuario.Nombre);
279				transaction.DataBase.AddInParameter(transaction.DBcomand, "@IsApproved", DbType.Boolean, objDTSeguridad.Usuario.Aprobado);
280				IDataReader reader = transaction.DataBase.ExecuteReader(transaction.DBcomand);
281				objDTSeguridad = new DTSeguridad();
282				DTUsuario usuario;
283				while (reader.Read())
284				{
285					usuario = new DTUsuario()
286					{
287						Nombre = reader["UserName"].ToString(),
288						Aprobado = (bool)reader["IsApproved"]
289					};
290					objDTSeguridad.ListaUsuarios.Add(usuario);
291				}
292				return objDTSeguridad;
293			}
294			catch (SqlException ex)
295			{
296				throw new CustomizedException(string.Format("Fallo en {0} - GetUsuarios()", ClassName),
297													   ex, enuExceptionType.SqlException);
298			}
299			catch (Exception ex)
300			{
301				throw new CustomizedException(string.Format("Fallo en {0} - GetUsuarios()", ClassName),
302													   ex, enuExceptionType.DataAccesException);
303			}
304		}
305
306		public DTUsuario GetUsuarioByEmail(string email)
307		{
308			// DSUsuarios.UsersDataTable dt = new DSUsuarios.UsersDataTable();
309			string rolesParam = string.Empty;
310			try
311			{
312				string query = @"SELECT aspnet_Membership.UserId, 
313                                        aspnet_Membership.Password, 
314                                        aspnet_Membership.PasswordQuestion, 
315                                        aspnet_Membership.PasswordAnswer, 
316                                        aspnet_Membership.IsApproved, 
317                                        aspnet_Membership.IsLockedOut, 
318                                        aspnet_Membership.ApplicationId, 
319                                        aspnet_Membership.PasswordFormat, 
320                                        aspnet_Membership.PasswordSalt, 
321                                        aspnet_Membership.MobilePIN, 
322                                        aspnet_Membership.Email, 
323                                        aspnet_Membership.LoweredEmail, 
324                                        aspnet_Users.UserName
325                                        FROM aspnet_Membership 
326                                        INNER JOIN
327	                                        aspnet_Users ON aspnet_Membership.UserId = aspnet_Users.UserId
328                                        WHERE
329                                           aspnet_Membership.Email LIKE @Email";
330
331
332				transaction.DBcomand = transaction.DataBase.GetSqlStringCommand(query);
333
334				// Ańadir parámetros
335				transaction.DataBase.AddInParameter(transaction.DBcomand, "@Email", DbType.String, email);
336				IDataReader reader = transaction.DataBase.ExecuteReader(transaction.DBcomand);
337				DTUsuario usuario = null;
338				while (reader.Read())
339				{
340					usuario = new DTUsuario();
341					usuario.Nombre = reader["UserName"].ToString();
342					usuario.Aprobado = (bool)reader["IsApproved"];
343					usuario.PaswordPregunta = reader["PasswordQuestion"].ToString();
344					usuario.PaswordRespuesta = reader["PasswordAnswer"].ToString();
345					usuario.Password = reader["Password"].ToString();
346					usuario.Email = reader["Email"].ToString();
347				}
348				return usuario;
349			}
350			catch (SqlException ex)
351			{
352				throw new CustomizedException(string.Format("Fallo en {0} - GetUsuarioByEmail()", ClassName),
353													   ex, enuExceptionType.SqlException);
354			}
355			catch (Exception ex)
356			{
357				throw new CustomizedException(string.Format("Fallo en {0} - GetUsuarioByEmail()", ClassName),
358													   ex, enuExceptionType.DataAccesException);
359			}
360		}
361
362		/// <summary>
363		/// Método que obtiene un rol filtrado por el ID
364		/// </summary>  
365		/// <param name="objRol">DTO con los parametros dentro</param>
366		/// <returns>Rol</returns>
367		public DTRol GetRol(DTRol objRol)
368		{
369			try
370			{
371				const string query = @"
372										SELECT 
373                                             ROL.RoleId
374                                            ,ROL.RoleName
375                                            ,ROL.LoweredRoleName
376                                            ,ROL.Description
377                                        FROM
378                                            aspnet_Roles AS ROL
379                                        WHERE 
380	                                       ( @RoleId IS NULL OR ROL.RoleId = @RoleId )
381											AND
382	                                       ( @Nombre IS NULL OR ROL.RoleName = @Nombre )";
383
384				transaction.DBcomand = transaction.DataBase.GetSqlStringCommand(query);
385
386				// Ańadir parámetros
387				if (!string.IsNullOrEmpty(objRol.RoleId))
388					transaction.DataBase.AddInParameter(transaction.DBcomand, "@RoleId", DbType.String, objRol.RoleId);
389				else
390					transaction.DataBase.AddInParameter(transaction.DBcomand, "@RoleId", DbType.String, DBNull.Value);
391				if (!string.IsNullOrEmpty(objRol.Nombre))
392					transaction.DataBase.AddInParameter(transaction.DBcomand, "@Nombre", DbType.String, objRol.Nombre);
393				else
394					transaction.DataBase.AddInParameter(transaction.DBcomand, "@Nombre", DbType.String, DBNull.Value);
395
396				IDataReader reader = transaction.DataBase.ExecuteReader(transaction.DBcomand);
397
398				while (reader.Read())
399				{
400					objRol.RoleId = reader["RoleId"].ToString();
401					objRol.Nombre = reader["RoleName"].ToString();
402					objRol.NombreCorto = reader["LoweredRoleName"].ToString();
403					if (!string.IsNullOrEmpty(reader["Description"].ToString()))
404						objRol.Descripcion = reader["Description"].ToString();
405				}
406				return objRol;
407			}
408			catch (SqlException ex)
409			{
410				throw new CustomizedException(string.Format("Fallo en {0} - GetRol()", ClassName),
411													   ex, enuExceptionType.SqlException);
412			}
413			catch (Exception ex)
414			{
415				throw new CustomizedException(string.Format("Fallo en {0} - GetRol()", ClassName),
416													   ex, enuExceptionType.DataAccesException);
417			}
418		}
419
420		public void CrearRol(DTSeguridad objSeguridad)
421		{
422
423			try
424			{
425				transaction.DBcomand = transaction.DataBase.GetStoredProcCommand("Roles_Insert");
426
427				// Ańadir parámetros
428				transaction.DataBase.AddInParameter(transaction.DBcomand, "@ApplicationName", DbType.String, objSeguridad.Aplicacion);
429				transaction.DataBase.AddInParameter(transaction.DBcomand, "@RoleName", DbType.String, objSeguridad.Rol.Nombre);
430				transaction.DataBase.AddInParameter(transaction.DBcomand, "@LoweredRoleName", DbType.String, objSeguridad.Rol.Nombre.ToLower());
431				transaction.DataBase.AddInParameter(transaction.DBcomand, "@Description", DbType.String, objSeguridad.Rol.Descripcion);
432
433				transaction.DataBase.ExecuteNonQuery(transaction.DBcomand);
434
435			}
436			catch (SqlException ex)
437			{
438				throw new CustomizedException(string.Format("Fallo en {0} - CrearRol()", ClassName),
439									ex, enuExceptionType.SqlException);
440			}
441			catch (Exception ex)
442			{
443				throw new CustomizedException(string.Format("Fallo en {0} - CrearRol()", ClassName),
444									ex, enuExceptionType.DataAccesException);
445			}
446		}
447
448		public void UpdateRol(DTRol objRol)
449		{
450			try
451			{
452				const string query = @"UPDATE aspnet_Roles
453                                        SET Description = @Descripcion
454                                        WHERE RoleId = @RoleId";
455
456				transaction.DBcomand = transaction.DataBase.GetSqlStringCommand(query);
457
458				// Ańadir parámetros
459				transaction.DataBase.AddInParameter(transaction.DBcomand, "@RoleId", DbType.String, objRol.RoleId);
460				transaction.DataBase.AddInParameter(transaction.DBcomand, "@Descripcion", DbType.String, objRol.Descripcion);
461
462				transaction.DataBase.ExecuteNonQuery(transaction.DBcomand);
463			}
464			catch (SqlException ex)
465			{
466				throw new CustomizedException(string.Format("Fallo en {0} - UpdateRol()", ClassName),
467													   ex, enuExceptionType.SqlException);
468			}
469			catch (Exception ex)
470			{
471				throw new CustomizedException(string.Format("Fallo en {0} - UpdateRol()", ClassName),
472													   ex, enuExceptionType.DataAccesException);
473			}
474		}
475		#endregion
476
477		/// <summary>
478		/// Método que desencripta un texto.
479		/// </summary>
480		/// <param name="textEncripted"></param>
481		/// <returns></returns>
482		private static string Desencriptar(string textEncripted)
483		{
484			UTF8Encoding encoder = new UTF8Encoding();
485			Decoder utf8Decode = encoder.GetDecoder();
486
487			byte[] todecodeByte = Convert.FromBase64String(textEncripted);
488			int charCount = utf8Decode.GetCharCount(todecodeByte, 0, todecodeByte.Length);
489			char[] decodedChar = new char[charCount];
490			utf8Decode.GetChars(todecodeByte, 0, todecodeByte.Length, decodedChar, 0);
491			string result = new string(decodedChar);
492
493			return result;
494		}
495	}
496}