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