c# - mvc - ActionFilterAttribute: se aplica a acciones de un tipo de controlador específico
net core authorization filter (2)
Estoy usando ActionFilterAttribute para hacer 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.
Aquí está mi controlador, derivado de mi clase de controlador personalizado, y un atributo de muestra:
public class MyController : CustomControllerBase
{
[CustomAuthorize(UserType = UserTypes.Admin)]
public ActionResult DoSomethingSecure()
{
return View();
}
}
Aquí hay 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 genial.
Aquí está la pregunta: ¿Puedo exigir que este atributo SÓLO se use en Acciones en mi tipo de controlador personalizado?
Con base en los comentarios y las limitaciones de mi sistema, tomé un enfoque híbrido. Básicamente, si la solicitud se envía a través de una ruta en caché o el "Usuario" no está configurado por algún motivo, la autenticación falla de la manera adecuada.
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
private MyUser User { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
//Lazy loads the user in the controller.
User = ((MyControllerBase)filterContext.Controller).User;
base.OnAuthorization(filterContext);
}
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
bool isAuthorized = false;
string retLink = httpContext.Request.Url.AbsolutePath;
if(User != null)
{
isAuthorized = User.IsValidated;
}
if (!isAuthorized)
{
//If the current request is coming in via an AJAX call,
//simply return a basic 401 status code, otherwise,
//redirect to the login page.
if (httpContext.Request.IsAjaxRequest())
{
httpContext.Response.StatusCode = 401;
}
else
{
httpContext.Response.Redirect("/login?retlink=" + retLink);
}
}
return isAuthorized;
}
}
Puede poner ActionFilter en la clase en sí. Todas las acciones en la clase realizarán el ActionFilter.
[CustomAuthorize]
public class AuthorizedControllerBase : CustomControllerBase
{
}
public class OpenAccessControllerBase : CustomControllerBase
{
}
public class MyRealController : AuthorizedControllerBase
{
// GET: /myrealcontroller/index
public ActionResult Index()
{
return View();
}
}