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?

¿Fue útil?

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()
    {

    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top