public ClaimDictionary AuthenticateExecute(ClaimDictionary inputClaims) { if (!_isInitialized) { throw new NucleoCommonException("El proveedor de seguridad de Active Directory no se encuentra inicializado. Posibles causas: No se encuentra configurado correctamente el string de conexión a AD."); } // Traspaso los claims al diccionario de salida. Dictionary <string, object> outputClaims = new Dictionary <string, object>(); foreach (var claim in inputClaims) { if (claim.Key == ClaimKeys.Password) { continue; } outputClaims.Add(claim.Key, claim.Value); } // Verifico si el nombre de usuario es válido. var userName = inputClaims["UserName"] as string; if (String.IsNullOrWhiteSpace(userName)) { Logger.Error("El nombre de usuario recibido es nulo o inválido. Verifique elemento \"UserName\" en el diccionario de evidencias enviadas al proveedor de seguridad de Active Directory."); outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.IncompleteData); return(new ClaimDictionary(outputClaims)); } // Verifico si la contraseña es válida var password = inputClaims["Password"] as string; if (String.IsNullOrEmpty(password)) { Logger.Error("La contraseña recibida para autenticar al usuario [{0}] es nula. Verifique elemento \"Password\" en el diccionario de evidencias enviadas al proveedor de seguridad de active directory.", userName); outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.IncompleteData); return(new ClaimDictionary(outputClaims)); } // Rut por defecto de usuario qamedico var rutDefecto = "15678036-7"; string rut = null; try { rut = ConfigurationManager.AppSettings["Alemana.Nucleo.Common.Security.Providers.MockSecurityProvider2.RutUsuario"]; } catch { } if (string.IsNullOrWhiteSpace(rut)) { rut = rutDefecto; } if (rut.Contains(".")) { rut = rut.Replace(".", string.Empty); } // Obtengo el contexto de seguridad para AD-DS outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.OK); outputClaims.Add(ClaimKeys.FirstName, "QAMEDICO"); outputClaims.Add(ClaimKeys.FathersName, "PAT6137313"); outputClaims.Add(ClaimKeys.MothersName, "MAT6137313"); outputClaims.Add(ClaimKeys.TelephoneNumber, "77778888"); outputClaims.Add(ClaimKeys.Email, "*****@*****.**"); outputClaims.Add(ClaimKeys.Rut, rut); var sRut = rut.Substring(0, rut.Length - 2); WsnucsessionWebClient cliente = new WsnucsessionWebClient(); var timer = new System.Diagnostics.Stopwatch(); timer.Start(); FcespGrabaSesionResult result = cliente.fcespGrabaSesion(sRut, userName, inputClaims["Mac"].ToString(), inputClaims["Ip"].ToString(), 1, "", "", "", 1, 1, 1, 1); var alias = result.poUsuvaAliasNombre; var sessionId = result.poSesnuSesionId; var usuarioId = result.poUsunuUsuarioId; Console.WriteLine(timer.Elapsed); Wssuser2rolesWebClient roles = new Wssuser2rolesWebClient(); SpsusFuncSuserXRutResult resultadoRoles = roles.spsusFuncSuserXRut(sRut); var rolesHolder = (resultadoRoles.roles == null || resultadoRoles.roles.Count() == 0) ? new List <RolModel>() : resultadoRoles.roles.Select(x => new RolModel { ID = x.rolId, Descripcion = x.funcionalidadDesc, grupoId = x.grupoId, grupoDescripcion = x.grupoDesc }).ToList(); Alemana.Nucleo.Shared.DataHolder.SetValue(Nucleo.Shared.DataHolderKeys.Roles, rolesHolder); outputClaims.Add("Roles", rolesHolder); if (!outputClaims.Any(k => k.Key == ClaimKeys.SessionId)) { outputClaims.Add(ClaimKeys.SessionId, sessionId.ToString()); } else { outputClaims[ClaimKeys.SessionId] = sessionId.ToString(); } if (!outputClaims.Any(k => k.Key == ClaimKeys.UsuarioId)) { outputClaims.Add(ClaimKeys.Alias, alias.ToString()); } outputClaims[ClaimKeys.UsuarioId] = usuarioId.ToString(); outputClaims.Add(ClaimKeys.VersionNuc, ClaimKeys.VersionNuc); return(new ClaimDictionary(outputClaims)); }
public ClaimDictionary AuthenticateExecute(ClaimDictionary inputClaims) { if (!_isInitialized) { throw new NucleoCommonException("El proveedor de seguridad de Active Directory no se encuentra inicializado. Posibles causas: No se encuentra configurado correctamente el string de conexión a AD."); } // Traspaso los claims al diccionario de salida. Dictionary <string, object> outputClaims = new Dictionary <string, object>(); foreach (var claim in inputClaims) { if (claim.Key == ClaimKeys.Password) { continue; } outputClaims.Add(claim.Key, claim.Value); } // Verifico si el nombre de usuario es válido. var userName = inputClaims["UserName"] as string; if (String.IsNullOrWhiteSpace(userName)) { Logger.Error("El nombre de usuario recibido es nulo o inválido. Verifique elemento \"UserName\" en el diccionario de evidencias enviadas al proveedor de seguridad de Active Directory."); outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.IncompleteData); return(new ClaimDictionary(outputClaims)); } // Verifico si la contraseña es válida var password = inputClaims["Password"] as string; if (String.IsNullOrEmpty(password)) { Logger.Error("La contraseña recibida para autenticar al usuario [{0}] es nula. Verifique elemento \"Password\" en el diccionario de evidencias enviadas al proveedor de seguridad de active directory.", userName); outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.IncompleteData); return(new ClaimDictionary(outputClaims)); } // Obtengo el contexto de seguridad para AD-DS using (var context = new PrincipalContext(ContextType.Domain, ActiveDirectoryUri.Authority, ActiveDirectoryUri.AbsolutePath.Substring(1, ActiveDirectoryUri.AbsolutePath.Length - 1), ContextOptions.Negotiate)) { // Vaidación de credenciales en AD if (!context.ValidateCredentials(userName, password)) { outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.BadPassword); return(new ClaimDictionary(outputClaims)); } // Obtengo datos del usuario using (var userPrincipal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, userName)) { // Usuario no existe if (userPrincipal == null) { Logger.Verbose("No se encontró la identidad [{0}] en Active Directory-", userName); outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.UserDoesNotExists); return(new ClaimDictionary(outputClaims)); } outputClaims.Add(ClaimKeys.AuthenticationStatus, AuthenticationStatus.OK); // Verifico cuenta bloqueada if (userPrincipal.IsAccountLockedOut()) { outputClaims[ClaimKeys.AuthenticationStatus] = AuthenticationStatus.AccountLocked; } // Verifico cuenta expirada if (userPrincipal.AccountExpirationDate.HasValue) { if (userPrincipal.AccountExpirationDate.Value < DateTime.Now) { outputClaims[ClaimKeys.AuthenticationStatus] = AuthenticationStatus.AccountExpired; } } outputClaims.Add(ClaimKeys.FirstName, userPrincipal.Name); outputClaims.Add(ClaimKeys.FathersName, userPrincipal.Surname); outputClaims.Add(ClaimKeys.MothersName, userPrincipal.GivenName); outputClaims.Add(ClaimKeys.TelephoneNumber, userPrincipal.VoiceTelephoneNumber); outputClaims.Add(ClaimKeys.Email, userPrincipal.EmailAddress); outputClaims.Add(ClaimKeys.Rut, userPrincipal.EmployeeId); var sRut = userPrincipal.EmployeeId.Substring(0, userPrincipal.EmployeeId.ToString().Length - 2); WsnucsessionWebClient cliente = new WsnucsessionWebClient(); decimal cargoId = 1; decimal estadoArchivo = decimal.Parse(Defaults.TipoInicio.ToString()); if (estadoArchivo == 2 || estadoArchivo == 3) // 2=> Contingencia Programada, 3 => Contingencia pasiva { cargoId = 99; //con este valor se recuperará el máximo id de sesión del usuario conectado en vez de generar un nuevo número } FcespGrabaSesionResult result = cliente.fcespGrabaSesion(sRut, userName, inputClaims["Mac"].ToString(), inputClaims["Ip"].ToString(), 1, ClaimKeys.VersionNuc.ToString(), "", "", 1, 1, 1, cargoId); var alias = result.poUsuvaAliasNombre; var sessionId = result.poSesnuSesionId; var usuarioId = result.poUsunuUsuarioId; Wssuser2rolesWebClient roles = new Wssuser2rolesWebClient(); SpsusFuncSuserXRutResult resultadoRoles = roles.spsusFuncSuserXRut(sRut); var rolesHolder = (resultadoRoles.roles == null || resultadoRoles.roles.Count() == 0) ? new List <RolModel>() : resultadoRoles.roles.Select(x => new RolModel { ID = x.rolId, Descripcion = x.funcionalidadDesc, grupoId = x.grupoId, grupoDescripcion = x.grupoDesc }).ToList(); Alemana.Nucleo.Shared.DataHolder.SetValue(Nucleo.Shared.DataHolderKeys.Roles, rolesHolder); outputClaims.Add("Roles", rolesHolder); outputClaims.Add(ClaimKeys.SessionId, sessionId.ToString()); outputClaims.Add(ClaimKeys.Alias, alias.ToString()); outputClaims.Add(ClaimKeys.UsuarioId, usuarioId.ToString()); // GetPublishedVersion(); outputClaims.Add(ClaimKeys.VersionNuc, ClaimKeys.VersionNuc); return(new ClaimDictionary(outputClaims)); } } }