Cómo utilizar AuthorizeAttribute personalizado para el controlador que utiliza el valor del parámetro?
-
26-09-2019 - |
Pregunta
Estoy tratando de asegurar una acción del controlador para evitar que un usuario acceda a una entidad que no tienen acceso a. Soy capaz de hacer esto con el siguiente código.
public ActionResult Entity(string entityCode)
{
if (CurrentUser.VerifyEntityPermission(entityCode))
{
//populate viewModel...
return View(viewModel);
}
return RedirectToAction("NoAccessToEntity", "Error");
}
Me gustaría ser capaz de añadir un atributo a la propia acción del controlador. Con el fin de validar el acceso a la entidad, lo que necesito para ver qué valor se ha pasado al controlador y qué entidades que el usuario tiene acceso. ¿Es esto posible?
[EntityAuthRequired]
public ActionResult Entity(string entityCode)
{
//populate viewModel...
return View(viewModel);
}
Solución
Algo como esto podría ayudarle en su camino. Aunque es posible que desee añadir algunas propiedades adicionales a su atributo para que pueda especificar el parámetro entitycode en cada acción, en lugar de codificar la misma.
public class EntityAuthRequired : FilterAttribute, IAuthorizationFilter
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Make sure that this is not NULL before assigning value as string...
var entityCode = filterContext.RouteData.Values["entityCode"] as string;
// do your logic...
if (!allowed)
filterContext.Result = new HttpUnauthorizedResult();
}
}
Además, si el entityCode
no está en tu RouteData, se puede utilizar para filterContext.RequestContext.HttpContext.Request
vistazo a los datos POST.