Estoy usando ActionFilterAttribute para realizar una lógica de autenticación personalizada. El atributo solo se usará en una clase de controlador derivado que contenga mi lógica de autenticación.ActionFilterAttribute: se aplica a acciones de un tipo de controlador específico
Aquí está mi controlador, derivado de mi clase de controlador personalizado, y un atributo de la muestra:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
He aquí un ejemplo de mi ActionFilterAttribute:
public class CustomAuthorizeAttribute : ActionFilterAttribute
{
public MyUserTypes UserType { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
myUser user = ((CustomControllerBase)filterContext.Controller).User;
if(!user.isAuthenticated)
{
filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
}
}
}
funciona muy bien.
Aquí está la pregunta: ¿Puedo exigir que este atributo SÓLO se use en Acciones en mi tipo de controlador personalizado?
Su atributo está roto porque no hereda de AuthroizeAttribute y, por lo tanto, no se garantiza que se ejecute cuando la acción se almacena en caché. Consulte http://blogs.teamb.com/craigstuntz/2009/09/09/38390/ para conocer las soluciones que funcionan con el almacenamiento en caché. –
¿Por qué el resultado de la acción se almacenará en caché? –
Se almacenaría en caché porque alguien le dijo que se almacenara en caché. Imagine que alguien pone el atributo Cache en una clase principal, sin darse cuenta del atributo roto en el subtipo. Es una idea mucho mejor usar un atributo que no es fundamentalmente incompatible con el almacenamiento en caché de ASP.NET/MVC. Vea el enlace de arriba para las opciones. –