Hacer cumplir Acción de filtrado en todas las acciones del controlador (C # / ASP.NET MVC)
-
20-09-2019 - |
Pregunta
Hice un nuevo filtro de acción (atributo, similar a [Autorizar]), que autoriza el acceso a una acción del controlador basado en un valor de sesión. Sin embargo, estoy básicamente decorar todas mis acciones del controlador con ese atributo (con la excepción de muy pocos).
Por lo tanto, pensé que sería mejor tener que Acción filtros siempre ejecutados excepto en los casos en que adjuntar una [ExemptFromAuthorize] atribuyen a una acción del controlador? (Tal vez a través de heredar a mi propia clase controlador?)
¿Cómo puedo hacer esto?
Solución
jeef3 respuesta 's, me encontré con esto. Se podría utilizar más la comprobación de errores y robustez como múltiples acciones delimitadas, pero la idea general funciona.
En su caso específico, usted podría probar el valor de sesión y decidir volver a cabo de la autorización también.
public class AuthorizeWithExemptionsAttribute : AuthorizeAttribute
{
public string Exemption { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.RouteData.GetRequiredString("action") == Exemption)
return;
base.OnAuthorization(filterContext);
}
}
Uso:
[AuthorizeWithExemptions(Roles="admin", ExemptAction="Index")]
public class AdminController : Controller
...
Otros consejos
Mira mi artículo sobre CodeProject -
http://www.codeproject.com/KB/web-security/ AuthorizeWithExemptions.aspx
En este artículo, voy a dar con una solución para asegurar los controladores de aplicación ASP.NET MVC de una manera que todas las acciones están asegurados excepto aquellos que defina como no seguro.
snipper del código:
public override void OnAuthorization(AuthorizationContext filterContext)
{
ActionDescriptor action = filterContext.ActionDescriptor;
bool IsUnsecured = action.GetCustomAttributes(
typeof(UnsecuredActionAttribute), true).Count() > 0;
//If doesn't have UnsecuredActionAttribute - then do the authorization
filterContext.HttpContext.SkipAuthorization = IsUnsecured;
base.OnAuthorization(filterContext);
}
Yo entiendo la pregunta es bastante anticuado, pero de todos modos .. Si desea aplicar el filtro a todas las acciones sólo tiene que añadir las siguientes líneas en Global.asax:
protected void Application_Start()
{
// your code here and then
RegisterGlobalFilters(GlobalFilters.Filters);
}
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new MyActionFilterAttribute());
}
Y en el filtro de la acción sólo se puede comprobar si la acción tiene otros atributos en forma siguiente:
public void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionDescriptor.IsDefined(typeof(AnotherActionAttribute), false))
{
// do what you want to do
}
}
Tal vez tratar de añadir una propiedad Except
a su primer atributo?
[MyAuthenticate(Exempt="View")]
public class MyController : Controller
{
public ActionResult Edit()
{
// Protected
}
public ActionResult View()
{
// Accessible by all
}
}
Puedes añadir el atributo a la clase a la que se aplica a todos los métodos de esa clase
[Authenticate]
public class AccountController : Controller
{
public ActionResult Index()
{
return View();
}
}
No sé cómo excluir un método específico de un atributo de nivel de clase. Tal vez usar un controlador separado para las solicitudes no autenticadas?
Para cualquiera que lea esto en 2013+, MVC4 ahora es compatible con el uso de [AllowAnonymous]
Se puede poner en Autorizar en el controlador, y luego en Permitir anónimos cualquier función que no desea autorizar.
Ejemplo:
[Autorizar] HomeController clase pública: Controller {
[AllowAnonymous] public ActionResult Index() { }
}
Que este trabajo con un filtro personalizado [MyAuthorize] o sólo trabajar con [Autorizar]
Para cualquiera que lea esto en 2013+, MVC4 ahora es compatible con el uso de [AllowAnonymous]
Se puede poner en Autorizar en el controlador, y luego Permitir anónimos en cualquier función que no desea autorizar.
Ejemplo:
[Authorize]
public class HomeController : Controller
{
[AllowAnonymous]
public ActionResult Index()
{
}
}