Pregunta

Me preguntaba si/cómo puedo anular el comportamiento predeterminado [autorizar] en ASP.NET MVC. Sé que puedo crear un nuevo filtro de acción, hacer mi propio atributo, etc. ¿Estoy simplemente interesado si simplemente puedo cambiar el comportamiento [autorizar] y reemplazar sus trabajos con mi propio código?

Editar: Chicos y chicas. Agradezco tu opinión, pero como escribí, soy no Buscando introducir un nuevo atributo [xyzauthorize]. Soy consciente de cómo hacer esto. Quiero mantener la notación [autorización] pero simplemente cambiar cómo funciona.

¿Fue útil?

Solución

Sí, eche un vistazo a los documentos de MSDN para autorizeAtTribute: http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx.

Básicamente, puede anular el método onauthorization () y personalizar el comportamiento. También hay otros métodos virtuales en el atributo.

Editar: como señaló Bruno, puede anular el método AuthorizeCore (). La principal diferencia es que AuthorizeCore () toma un httpContextBase, mientras que onauthorization () toma un autorización de autorización. Una instancia de AuthorizationContext le proporciona más información, como el controlador, el requestContext y Routedata. También le permite especificar un ActionResult.

AutorizeCore () está más restringido en la información a la que puede acceder, así como el resultado que puede devolver, pero si necesita autorizar datos en caché, su lógica debe manejar el caso en el que no tiene ninguno de esos datos adicionales ( dado que los datos se atienden desde el caché antes de que la solicitud se enruta a través de la tubería MVC).

Como siempre, debe comprender su escenario y las herramientas y compensaciones disponibles entre ellos.

Otros consejos

Puede subclase el filtro AuthorizeAtTribute y colocar su propia lógica dentro de él.

Veamos un ejemplo. Supongamos que siempre quiere autorizar las conexiones locales. Sin embargo, si se trata de una conexión remota, desea mantener la lógica de autorización habitual.

Podrías hacer algo como:

public class LocalPermittedAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            return (httpContext.Request.IsLocal || base.AuthorizeCore(httpContext)));
        }
}

O siempre puede autorizar una determinada dirección remota (su máquina, por ejemplo).

¡Eso es todo!

EDITAR: Olvidé mencionar que lo usará de la misma manera que utilizaría el filtro autorizeatTribute:

class MyController : Controller
{
    [LocalPermittedAuthorize]
    public ActionResult Fire()
    {
        Missile.Fire(Datetime.Now);
    }
}

Implemente su propio proveedor de roles y configure su aplicación para usarla. Luego, el atributo de autorización respetará su código de atorización.

Veo solo 2 maneras: anulación AuthorizeAttribute.OnAuthorization método o creación de su propio atributo de autorización desde cero.

1) Muy fácil:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        /// your behavior here
    }
}

2) Fácil también: solo mira la fuente ASP.NET MVC, AutorizeatTribute.cs expediente

Parece que puede implementar un filtro personalizado como de costumbre (y heredar autorizeAtTribute si lo desea), y luego crear un nuevo ActionInvoker que herede ControlerActionInvoker y anula GetFilters. En GetFilters, llamas base.GetFilters() Para obtener la lista de filtros, el iterar a través de la autorización y reemplazar las llamadas a autorizarfilter con llamadas a su filtro personalizado.

Otra forma potencial es implementar la membresía personalizada y los proveedores de roles, dependiendo de lo que esté tratando de hacer.

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