2009-08-27 17 views
10

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, básicamente estoy decorando todas mis acciones de control con ese atributo (con la excepción de muy pocas).Enforce Acción de filtrado en todas las acciones del controlador (C#/ASP.NET MVC)

lo tanto, pensé que sería mejor tener que Acción de filtrado siempre ejecutado , excepto en los casos en que adjuntar un atributo [ExemptFromAuthorize] a una acción del controlador? (Tal vez a través de heredar a mi propia clase controlador?)

¿Cómo puedo hacer esto?

+0

Esta pregunta es antigua y en MVC4 hay un nuevo atributo llamado 'AllowAnonymous 'hecho específicamente para esto. – Omar

Respuesta

6

Correr con respuesta jeef3 's, se me ocurrió esto. Podría usar más control 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 
... 
2

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 por separado para las solicitudes no autenticadas?

+0

Hacer controladores separados espaguetizaría mi código ... excluyendo los métodos específicos del atributo de nivel de clase sería exactamente lo que necesito. – Alex

3

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 
    } 
} 
+0

¿Cómo funcionaría la lógica en el filtro de acción? (¿Realmente hacer el trabajo "Exento")? – Alex

7

Compruebe hacia fuera 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 ASP.NET MVC los controladores de la aplicación de forma que todas las acciones estén seguras, excepto aquellas que defina como no seguras.

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); 
} 
+1

Esto es más o menos lo que iba a sugerir. –

0

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 cualquiera de las funciones no quieres autorizar

Ejemplo:

[Authorize] 
public class HomeController : Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Index() 
    { 

    } 
} 
6

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 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 filtro de acción que sólo 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 
    } 
} 
+0

ActionDescriptor no define actualmente "IsDefined". – hallizh

+0

Para cualquier persona que venga a esto para la pregunta en el título de la pregunta, la primera parte de esto es la respuesta real a cómo ejecutar un filtro de acción en cada acción del controlador. –

1

Para cualquiera que lea esto en 2013+, MVC4 ahora es compatible con el uso de [AllowAnonymous]

Puede poner Authorize en el controlador y luego Allow Anonymous en cualquier función que no desee 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]

+0

Si deriva su [MyAuthorize] de AuthorizeAttribute, [AllowAnonymous] funcionará para usted. – Gh61

Cuestiones relacionadas