Exemplo n.º 1
0
        /// <summary>
        /// Permite agregar reglas para validar los permisos del usuario
        /// </summary>
        /// <param name="context"></param>
        /// <param name="operacion"></param>
        /// <param name="recurso"></param>
        /// <returns></returns>
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, OperationAuthorizationRequirement operacion, PermisoDTO recurso)
        {
            var usuarioId = Convert.ToInt32(context.User.FindFirst(c => c.Type == ClaimTypes.Sid).Value);

            //Se revisa si en el token se incluye el claim con el id del usuario
            if (!context.User.HasClaim(c => c.Type == ClaimTypes.Sid))
            {
                context.Fail();
            }
            RolDAO rolDAO          = new RolDAO(contexto, _localizer);
            bool   esAdministrador = rolDAO.EsAdministrador(usuarioId);

            //Si el recurso  requiere un usuario administrador se valida que
            //el usuario sea administrador, si no es asi marcar error
            if (recurso.RequiereAdministrador && !esAdministrador)
            {
                context.Fail();
            }
            else
            {
                if (!esAdministrador)
                {
                    //Se revisa si el usuario tiene autorización para realizar la acción
                    RolTablaPermisoDAO rolTablaPermisoDAO = new RolTablaPermisoDAO(contexto, _localizer);
                    if (!rolTablaPermisoDAO.TienePermiso(usuarioId, recurso.Tabla, operacion.Name))
                    {
                        context.Fail();
                    }
                    else
                    {
                        context.Succeed(operacion);
                    }
                }
                context.Succeed(operacion);
            }
            return(Task.CompletedTask);
        }
Exemplo n.º 2
0
        /// <summary>
        /// Se ejecuta antes de llamar un servicio
        /// </summary>
        /// <param name="context"></param>
        public void OnActionExecuting(ActionExecutingContext context)
        {
            JsonResult  jsonResult;
            CustomError customError = new CustomError(403, "El usuario es inválido");
            //Obtenemos los datos del usuario
            ClaimsPrincipal Usuario = context.HttpContext.User;

            //Se revisa si en el token se incluye el claim con el id del usuario
            if (!Usuario.HasClaim(c => c.Type == ClaimTypes.Sid))
            {
                //regresmos un mensaje de error
                jsonResult = new JsonResult(customError)
                {
                    StatusCode = 403,
                    Value      = "Usuario con token incorrecto"
                };
                context.Result = jsonResult;
                return;
            }
            var usuarioId = Convert.ToInt32(Usuario.FindFirst(c => c.Type == ClaimTypes.Sid).Value);

            //Obtenemos los datos del controller
            var controller = context.Controller as BaseController;
            var metodo     = controller.Request.Method.ToLower();

            RolDAO rolDAO          = new RolDAO(_context, _localizer);
            bool   esAdministrador = rolDAO.EsAdministrador(usuarioId);

            //Si el recurso  requiere un usuario administrador se valida que
            //el usuario sea administrador, si no es asi marcar error
            if (controller.permiso.RequiereAdministrador && !esAdministrador)
            {
                jsonResult = new JsonResult(customError)
                {
                    StatusCode = 403,
                    Value      = "El usuario no tiene acceso"
                };
                context.Result = jsonResult;
                return;
            }
            else
            {
                if (!esAdministrador)
                {
                    string operacion = string.Empty;
                    //obtenemos el tipo de método que se esta ejecutando
                    switch (metodo)
                    {
                    case "get":
                        operacion = Operaciones.Consultar.Name;
                        break;

                    case "post":
                        operacion = Operaciones.Crear.Name;
                        break;

                    case "put":
                    case "patch":
                        operacion = Operaciones.Modificar.Name;
                        break;

                    case "delete":
                        operacion = Operaciones.Borrar.Name;
                        break;
                    }
                    //Se revisa si el usuario tiene autorización para realizar la acción
                    RolTablaPermisoDAO rolTablaPermisoDAO = new RolTablaPermisoDAO(_context, _localizer);
                    if (!rolTablaPermisoDAO.TienePermiso(usuarioId, controller.permiso.Tabla, operacion))
                    {
                        jsonResult = new JsonResult(customError)
                        {
                            StatusCode = 403,
                            Value      = "Usuario sin permiso"
                        };
                        context.Result = jsonResult;
                        return;
                    }
                }
            }
        }