public static Accion ActionControllerToActionFunctionality(IRepositoryAuthorizationFilter authorizationFilter, Funcionalidad funcionalidad, string actionName)
        {
            //Utilizar Sinonimos
            string accion = string.Empty;

            var listAction = from i in authorizationFilter.GetListSynonymousAction()
                             where actionName.StartsWith(i.Key, StringComparison.OrdinalIgnoreCase)
                             select i;

            if (listAction.Count() == 1)
            {
                accion = listAction.ToList()[0].Value;
            }

            if (listAction.Count() > 1)
            {
                throw new Exception(string.Format("Existe varias coincidencias entre el nombre de la accion [{0}], al mapper sinominos de acciones, a la accion estandar: [{1}]", actionName, listAction.ToList()[0].Value));
            }

            //Buscar la accion si existe en la funcionalidad, o el sinomimo
            var listAccionesFuncionalidad = from i in funcionalidad.Acciones
                                            where actionName.StartsWith(i.Codigo, StringComparison.OrdinalIgnoreCase) ||
                                            accion.StartsWith(i.Codigo, StringComparison.OrdinalIgnoreCase)
                                            select i;

            if (listAccionesFuncionalidad.Count() == 1)
            {
                return(listAccionesFuncionalidad.ToList()[0]);
            }

            return(null);
        }
        /// <summary>
        /// Si el controlador no se debe aplicar autorizacion. Ejemplo pagina de inicio del sitio web.
        /// </summary>
        /// <param name="controllerDescriptor"></param>
        /// <returns></returns>
        public static bool SkipControllerSecurity(IRepositoryAuthorizationFilter authorizationFilter, ControllerDescriptor controllerDescriptor)
        {
            var filter = from i in authorizationFilter.GetListSkipController()
                         where controllerDescriptor.ControllerName.Equals(i, StringComparison.OrdinalIgnoreCase)
                         select i;

            var list = filter.ToList();

            log.DebugFormat("Resultado de omitir controladores : [{0}]. Cantidad de elementos que coincide con la nombre  de controlador desde el listado de omitidos : [{1}]", controllerDescriptor.ControllerName, list.Count);

            return(list.Count > 0);
        }
        /// <summary>
        /// Si la acion no es considerada en la verificacion de autorizacion. Ejemplo Validar<Regla>, acciones para validaciones remotadas
        /// </summary>
        /// <param name="actionDescriptor"></param>
        /// <returns></returns>
        public static bool SkipActionSecurity(IRepositoryAuthorizationFilter authorizationFilter, ActionDescriptor actionDescriptor)
        {
            var filter = from i in authorizationFilter.GetListSkipAction()
                         where actionDescriptor.ActionName.StartsWith(i, StringComparison.OrdinalIgnoreCase)
                         select i;

            var list = filter.ToList();

            log.DebugFormat("Resultado de omitir action : [{0}]. Cantidad de elementos que coincide con la accion desde el listado de omitidos : [{1}]", actionDescriptor.ActionName, list.Count);

            return(list.Count > 0);
        }
        /// <summary>
        /// Verificar si controlador / accion no se debe aplicar auntentificacion.
        /// 1. Saltar autorizacion, si el controlador o la accion tiene el atributo AllowAnonymousAttribute
        /// 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
        /// </summary>
        /// <param name="authorizationFilter"></param>
        /// <param name="actionDescriptor"></param>
        /// <returns></returns>
        public static bool SkipControllerActionSecurity(IRepositoryAuthorizationFilter authorizationFilter, ActionDescriptor actionDescriptor)
        {
            bool isAllowAnonymousAttribute =
                actionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true) ||
                actionDescriptor.ControllerDescriptor.IsDefined(
                    typeof(AllowAnonymousAttribute), inherit: true);


            if (isAllowAnonymousAttribute)
            {
                return(true);
            }


            if (SkipControllerSecurity(authorizationFilter, actionDescriptor.ControllerDescriptor))
            {
                return(true);
            }


            return(SkipActionSecurity(authorizationFilter, actionDescriptor));
        }