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