示例#1
0
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            Aplicacion aplicacion = (Aplicacion)HttpContext.Current.Session["Aplicacion"];

            if (aplicacion != null)
            {
                var dbcontext = HttpContext.Current.GetOwinContext().Get <IPushNewsUnitOfWork>();
                IAplicacionesServicio srvAplicaciones = new AplicacionesServicio(dbcontext);
                aplicacion = srvAplicaciones.GetSingle(a => a.AplicacionID == aplicacion.AplicacionID);
                string[] caracteristicasAplicacion = aplicacion.Caracteristicas.Select(c => c.Nombre).ToArray();
                if (Caracteristicas.All(c => caracteristicasAplicacion.Contains(c)))
                {
                    base.OnActionExecuting(filterContext);
                    return;
                }
            }

            log.WarnFormat(
                "El usuario {0} ha realizado una solicitud a {1} utilizando la aplicación \"{2}\" "
                + "que no tiene las características requeridas para usar dicha función: ({3}).",
                filterContext.HttpContext.User.Identity.Name, filterContext.HttpContext.Request.Url,
                aplicacion.Nombre, string.Join(", ", Caracteristicas));

            // Si no hay aplicación o la aplicación no tiene alguna de las características requeridas
            // se devuelve un error 403 Forbidden
            filterContext.Result = new JsonResult()
            {
                Data = new
                {
                    Titulo  = Txt.ErroresComunes.FaltaCaracteristicaTitulo,
                    Mensaje = Txt.ErroresComunes.FaltaCaracteristicaMensaje
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            filterContext.HttpContext.Response.StatusCode             = 403;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
示例#2
0
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            // Extraer el subdominio de la URL de la solicitud
            string host = filterContext.HttpContext.Request.Headers["Host"];
            Uri    url  = filterContext.HttpContext.Request.Url;

            string[] hostPartido = host.Split('.');

#if DEBUG
            #region Simular el subdominio utilizando el parámetro SubdominioDepuracion
            // Sólo en configuración de depuración: si el host no tiene subdominio (típico en
            // depuración) se inserta al principio del array hostPartido el subdominio de la aplicación de la
            // sesión, o en su defecto el subdominio por defecto almacenado en la tabla Parámetros de la base
            // de datos con la clave "SubdominioDepuracion".
            Aplicacion apl = (Aplicacion)HttpContext.Current.Session["Aplicacion"];
            if (apl != null)
            {
                hostPartido = new[] { apl.SubDominio, hostPartido[0] };
            }
            else if (hostPartido.Length < 2)
            {
                var dbcontext = HttpContext.Current.GetOwinContext().Get <IPushNewsUnitOfWork>();
                IParametrosServicio srvParametros        = new ParametrosServicio(dbcontext /*, null*/);
                Parametro           subdominioDepuracion = srvParametros.GetByName("SubdominioDepuracion");
                if (subdominioDepuracion != null)
                {
                    hostPartido = new[] { subdominioDepuracion.Valor, hostPartido[0] };
                }
            }
            #endregion
#endif

            // Si el host no contiene subdominio, redirigir a la página comercial.
            if (hostPartido.Length < 2)
            {
                log.Info($"Solicitud sin subdominio. Redirigir a la web comercial. Host de la solicitud: {host}");
                filterContext.Result = new RedirectResult("http://www.pushnews.com");
            }
            else
            {
                string subdominio = hostPartido[0];

                var dbcontext = HttpContext.Current.GetOwinContext().Get <IPushNewsUnitOfWork>();
                IParametrosServicio srvParametros = new ParametrosServicio(dbcontext /*, null*/);
                Parametro           parametroSubdominioGenerico = srvParametros.GetByName("SubdominioGenerico");
                string subdominioGenerico = parametroSubdominioGenerico?.Valor ?? "";

                if (subdominio == subdominioGenerico)
                {
                    // Si se está accediendo con el subdominio genérico, no se puede dar acceso a la parte
                    // pública (webapp). Salvo que se solicite una url de la parte privada (backend) cuya
                    // ruta local empieza por "/backend", redirigirá a la web comercial.
                    if (!url.LocalPath.StartsWith("/backend"))
                    {
                        log.Info($"Solicitud a subdominio genérico fuera del backend. Redirigir a la web comercial. Url de la solicitud: {url.ToString()}");
                        filterContext.Result = new RedirectResult("http://www.pushnews.com");
                    }
                }
                else
                {
                    /* 14/3/2016 EAR
                     * Para garantizar que los cambios realizados en la versión, el tipo o el cloudkey de la
                     * aplicación afecten a las sesiones abiertas, recargamos el objeto aplicación a la
                     * sesión en cada solicitud. Esto se puede quitar para producción si se quiere optimizar.
                     * eliminando los comentarios de la declaración de aplicacion (obtenida de la sesión) y
                     * del bloque condicional siguiente).
                     */

                    // Si hay un objeto Aplicacion almacenado en la sesión y el subdominio es el mismo, no
                    // hay que hacer nada más. Si por el contrario no hay objeto Aplicacion en la sesión, se
                    // obtiene el objeto Aplicacion correspondiente al subdominio y se almacena en la sesíón.
                    Aplicacion aplicacion = (Aplicacion)HttpContext.Current.Session["Aplicacion"];
                    if (aplicacion == null)
                    {
                        // Obtener la aplicación asociada al subdominio
                        IAplicacionesServicio srvAplicaciones = new AplicacionesServicio(dbcontext);
                        aplicacion = srvAplicaciones.GetBySubdomain(subdominio);

                        // Si no se encuentra una aplicación asociada al subdominio, redirigir a la página comercial.
                        if (aplicacion == null)
                        {
                            log.Info($"El subdominio no corresponde a ninguna aplicación. Subdominio de la solicitud: {subdominio}");
                            filterContext.Result = new RedirectResult("http://www.pushnews.com");
                        }
                        else
                        {
                            // Guardar el objeto aplicación en la sesión
                            HttpContext.Current.Session.Add("Aplicacion", aplicacion);
                            HttpContext.Current.Session.Add("Caracteristicas", aplicacion.Caracteristicas
                                                            .Where(c => c.Activo)
                                                            .Select(c => (Dominio.Enums.AplicacionCaracteristica)c.AplicacionCaracteristicaID));
                        }
                    }
                }
            }

            base.OnActionExecuting(filterContext);
        }