public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //1. SISTEMA
            //   1.1 Funcionalidades
            //       1.1.1 Acciones
            //   1.2 Roles
            //       1.2.1 Permisos => Acciones => Funcionalidades
            //   1.3 Menus
            //      1.3.1. Items Menu => Funcionalidad

            //APLICAR AUTORIZACION BASADO EN EL NOMBRE DEL CONTROLADOR
            //controller/accion/parametros
            //{controller}/{action}/{id}
            //Mapear los nombres de los controllers a los menus y estos a las funcionalidades



            if (filterContext == null)
            {
                throw new ArgumentNullException("AuthorizeFilterAttribute");
            }


            //1. Saltar autorizacion, si el controlador o la accion tiene el atributo AllowAnonymousAttribute
            bool isAllowAnonymousAttribute =
                filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true);


            if (isAllowAnonymousAttribute)
            {
                return;
            }

            //2. Saltar autorizacion.
            //2.1 Controladores o acciones que no se debe verificar
            //2.2 Atributos explicitos en los controladores que indica que no se debe verificar la autorizacion

            if (SecurityControllerHelper.SkipControllerSecurity(filterContext.ActionDescriptor.ControllerDescriptor))
            {
                //log.InfoFormat("No aplicar autorización al controllador ", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
                return;
            }

            if (SecurityControllerHelper.SkipActionSecurity(filterContext.ActionDescriptor))
            {
                //log.InfoFormat("No aplicar autorización a la action {0} del controller {1}", filterContext.ActionDescriptor.ActionName, filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
                return;
            }



            HttpContext ctx = HttpContext.Current;

            if (!ctx.Request.IsAuthenticated)
            {
                return;
            }


            //3.  Verifica si la session es soportada y si el existe autentificacion activa
            if (ctx.Session != null)
            {
                var application = ServiceLocator.Current.GetInstance <IApplication>();

                //2.1 Verificar si existe autentificacion no activa en el sistema, y mvc tiene la peticion autentificada.
                //Existe una desface, se debe forzar a salir
                if (!application.IsAuthenticated())
                {
                    //FORZAR A SALIR DE LA APLICACION, EXISTE UN DESFACE ENTRE AUTENTIFICACION EN EL SISTEMA Y AUTENTIFICACION LA PETICION
                    //BORRAR:
                    //var usuario = _application.GetCurrentUser();
                    //_accessService.EndUserAccess(usuario);

                    ////TODO: DEPENDENCIAS DE REINICIAR. MEJOR GUARDAR EN SESSION LA IDENTIDAD
                    //FormsAuthentication.SignOut();

                    //Session.Clear();
                    //return RedirectToAction("Ingreso");

                    //TODO: JSA QUE PASA CON REQTICIONES AJAX ???
                    if (ctx.Request.IsAuthenticated)
                    {
                        ctx.Session.Clear();
                        FormsAuthentication.SignOut();
                    }
                    ctx.Response.Redirect(FormsAuthentication.LoginUrl);
                }
            }


            //TODO: JSA, PARA MEJORAR RENDIMIENTO.. SE DEBE GUARDAR
            // (Controller/Action => Funcionalidad/accion Asociada), puesto que verifica esta combinacion por cada peticion al sistema.

            var servicioFuncionalidad = ServiceLocator.Current.GetInstance <IFuncionalidadService>();

            var funcionalidadRelacionada = SecurityControllerHelper.ControllerToFunctionality(servicioFuncionalidad.GetFuncionalidades(),
                                                                                              filterContext.ActionDescriptor.ControllerDescriptor);

            if (funcionalidadRelacionada == null)
            {
                var url      = new UrlHelper(filterContext.RequestContext);
                var logonUrl = url.Action("NoAutorizado", "Cuenta", new { reason = string.Format("No existe funcionalidades asociadas al controlador {0}", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName) });
                filterContext.Result = new RedirectResult(logonUrl);
                return;
            }
            else
            {
                var accion = SecurityControllerHelper.ActionControllerToActionFunctionality(funcionalidadRelacionada, filterContext.ActionDescriptor);

                var servicio = ServiceLocator.Current.GetInstance <IAuthorizationService>();
                if (!servicio.Authorize(accion))
                {
                    if (filterContext.HttpContext.Request.IsAjaxRequest())
                    {
                        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;

                        var result = new JsonResult
                        {
                            Data = new { success = false, error = string.Format("Acceso restringido a la funcionalidad [{0}], en la acción de [{1}]", funcionalidadRelacionada.Nombre, accion.Nombre) },
                            //ContentType = contentType,
                            //ContentEncoding = contentEncoding,
                            JsonRequestBehavior = JsonRequestBehavior.DenyGet
                        };

                        filterContext.Result = result;
                        return;
                    }
                    else
                    {
                        var url      = new UrlHelper(filterContext.RequestContext);
                        var logonUrl = url.Action("NoAutorizado", "Cuenta", new { reason = string.Format("Acceso restringido a la funcionalidad {0}, en la acción de [{1}]", funcionalidadRelacionada.Nombre, accion.Nombre) });
                        filterContext.Result = new RedirectResult(logonUrl);
                        return;
                    }
                }
            }
        }
Beispiel #2
0
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            //1. SISTEMA
            //   1.1 Funcionalidades
            //       1.1.1 Acciones
            //   1.2 Roles
            //       1.2.1 Permisos => Acciones => Funcionalidades
            //   1.3 Menus
            //      1.3.1. Items Menu => Funcionalidad

            //APLICAR AUTORIZACION BASADO EN EL NOMBRE DEL CONTROLADOR
            //controller/accion/parametros
            //{controller}/{action}/{id}
            //Mapear los nombres de los controllers a los menus y estos a las funcionalidades



            if (filterContext == null)
            {
                throw new ArgumentNullException("AuthorizeFilterAttribute");
            }


            //1. Saltar autorizacion, si el controlador o la accion tiene el atributo AllowAnonymousAttribute
            bool isAllowAnonymousAttribute =
                filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true);


            if (isAllowAnonymousAttribute)
            {
                return;
            }

            //2. Saltar autorizacion.
            //2.1 Controladores o acciones que no se debe verificar
            //2.2 Atributos explicitos en los controladores que indica que no se debe verificar la autorizacion

            if (SecurityControllerHelper.SkipControllerSecurity(filterContext.ActionDescriptor.ControllerDescriptor))
            {
                //log.InfoFormat("No aplicar autorización al controllador ", filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
                return;
            }

            if (SecurityControllerHelper.SkipActionSecurity(filterContext.ActionDescriptor))
            {
                //log.InfoFormat("No aplicar autorización a la action {0} del controller {1}", filterContext.ActionDescriptor.ActionName, filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
                return;
            }

            //Rol Administrador, tiene todos los permisos
            var _application = ServiceLocator.Current.GetInstance <IApplication>();
            var rol          = _application.GetCurrentRol();

            if (rol.EsAdministrador)
            {
                return;
            }

            //TODO: JSA, PARA MEJORAR RENDIMIENTO.. SE DEBE GUARDAR
            // (Controller/Action => Funcionalidad/accion Asociada), puesto que verifica esta combinacion por cada peticion al sistema.

            var servicioFuncionalidad = ServiceLocator.Current.GetInstance <IFuncionalidadService>();

            var funcionalidadRelacionada = SecurityControllerHelper.ControllerToFunctionality(servicioFuncionalidad.GetFuncionalidades(),
                                                                                              filterContext.ActionDescriptor.ControllerDescriptor);

            if (funcionalidadRelacionada == null)
            {
                var mensaje = string.Format("No existe funcionalidades asociadas al controlador {0}",
                                            filterContext.ActionDescriptor.ControllerDescriptor.ControllerName);
                filterContext.Result = StatusResponseHelper.JsonErrorServidor(mensaje, false);
            }
            else
            {
                var accion = SecurityControllerHelper.ActionControllerToActionFunctionality(funcionalidadRelacionada, filterContext.ActionDescriptor);

                var servicio = ServiceLocator.Current.GetInstance <IAuthorizationService>();
                if (!servicio.Authorize(accion))
                {
                    filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.Forbidden;

                    var mensaje = string.Format("Acceso restringido a la funcionalidad [{0}], en la acción de [{1}]",
                                                funcionalidadRelacionada.Nombre, accion.Nombre);

                    filterContext.Result = StatusResponseHelper.JsonNoAutorizado(mensaje, true);
                }
            }
        }