/// <summary>
        ///     Crear un boleto de autenticación para una sesión en el Sistema
        /// </summary>
        /// <param name="session">Información de la sesión</param>
        /// <exception cref="System.ArgumentNullException">session</exception>
        private static void CreateAuthTicket(HealthSession session) {
            if (session == null) throw new ArgumentNullException("session");
            //
            // recuperar contexto http actual
            var httpContext = HttpContext.Current;
            //
            // hay contexto http?
            if (httpContext == null) return;
            //
            // borrar cualquier cookie anterior con el mismo nombre de la cookie de autenticación
            RemoveAuthCookies();
            //
            // guardar la sesión y obtener el número de cookies que fueron necesarias para guardarla
            var numberOfCookies = SaveSessionInCookies(httpContext, session);
            //
            // boleto de autenticación
            // guardar en la cookie de autenticación el número de cookies que son
            var authTicket = new FormsAuthenticationTicket(
                    _configuration.TicketVersion,
                    session.UserName,
                    DateTime.Now,
                    DateTime.Now.AddMinutes(_configuration.MinutesOfTicketValidity),
                    _configuration.IsPersistentTicket,
                    numberOfCookies.ToString(CultureInfo.InvariantCulture));
            //
            // necesarias para almacenar toda la información del boleto de autenticación
            var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));

            httpContext.Response.Cookies.Add(cookie);
        }
        /// <summary>
        /// Initializes a new instance of the <see cref="HealthIdentity"/> class.
        /// </summary>
        /// <param name="session">The session.</param>
        /// <exception cref="System.ArgumentNullException">session</exception>
        public HealthIdentity(HealthSession session)
        {
            if (session == null) throw new ArgumentNullException("session");

            Session = session;
        }
        /// <summary>
        ///     Serializa una sesión a texto Base 64
        /// </summary>
        /// <param name="session">Sesion a serializar</param>
        /// <returns>Texto serializado en Base 64</returns>
        private static string SerializeSession(HealthSession session) {
            // crear serializador
            var serializer = new BinaryFormatter();
            //
            // memoria que almacenará el objeto serializado
            var serializedBuffer = new MemoryStream();
            //
            // serializar la sesión
            serializer.Serialize(serializedBuffer, session);
            //
            // convertir a texto la memoria serializada
            var serialized = Convert.ToBase64String(serializedBuffer.ToArray());
            //
            // liberar memoria
            serializedBuffer.Dispose();

            return serialized;
        }
        /// <summary>
        ///     Inicia una sesión web para un usuario en una campaña específica
        /// </summary>
        /// <param name="userName">Name of the user.</param>
        /// <param name="password">The password.</param>
        /// <returns>Verdadero si fue posible autenticar al usuario, en caso contrario Falso</returns>
        /// <exception cref="System.ArgumentNullException">
        ///     userName
        ///     or
        ///     password
        /// </exception>
        public bool Authenticate(string userName, string password) {
            if (string.IsNullOrEmpty(userName)) throw new ArgumentNullException("userName");
            if (string.IsNullOrEmpty(password)) throw new ArgumentNullException("password");
            //
            // información del usuario autenticado
            User user;
            IEnumerable<string> roles;
            //
            // usuario y clave válidos?
            if (!HealthMembership.Authenticate(userName, password, out user, out roles)) return false;
            //
            // crear objeto con información del usuario
            var session = new HealthSession(user.UserId, userName, user.UserStateId, roles);
            //
            // crear boleto de autenticación
            CreateAuthTicket(session);

            return true;
        }
        /// <summary>
        ///     Guarda la información de una sesión en varias cookies, el número depende del tamaño máximo que puede almacenar la
        ///     cookie
        /// </summary>
        /// <param name="httpContext">Contexto HTTP en el que se crearán las cookies</param>
        /// <param name="session">Información de la sesión a guardar</param>
        /// <returns>Número de cookies que fueron necesarias para almacenar la información de la sesión</returns>
        /// <exception cref="System.ArgumentNullException">session</exception>
        private static int SaveSessionInCookies(HttpContext httpContext, HealthSession session) {
            if (session == null) throw new ArgumentNullException("session");

            var responseCookies = httpContext.Response.Cookies;
            //
            // serializar la sesión
            var serializedSession = SerializeSession(session);
            //
            var cookieLength = _configuration.CookieMaxValueLength;
            //
            // determinar el cuántas cookies en que se almacenará la información
            // del boleto de autenticación serializado
            var numberOfCookies = (serializedSession.Length / cookieLength) + 1;
            //
            // segmentar la información del boleto de autenticación en cookies del tamaño máximo
            for (int i = 0, ic = 1; i < serializedSession.Length; i += cookieLength){
                responseCookies.Add(
                        new HttpCookie(
                                (FormsAuthentication.FormsCookieName + ic++),
                                new string(serializedSession.Skip(i).Take(cookieLength).ToArray())));
            }

            return numberOfCookies;
        }