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));
                }
            }
        }